转义字符(Escape character),是编程语言中的一种特殊字符,它用于表示那些在字符串中具有特殊含义的字符。转义字符通常由反斜杠(\)开始,后面跟着一个或多个字符,表示一个特定的控制字符或转义序列。当转义字符(EscapeCharacter)放在字符序列时,它将对它后续的几个字符进行替代并解释。转义字符是元字符的一种特殊情况。
所有的ASCII码[2]都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。1
定义
转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。因此转义字符开头的字符序列被叫做转义序列。
转义序列通常有两种功能。第一个是编码一个句法上的实体,如设备命令或者无法被字母表直接表示的特殊数据。第二种功能,也叫字符引用,用于表示无法在当前上下文中被键盘录入的字符(如字符串中的回车符),或者在当前上下文中会有不期望的含义的字符(如C语言字符串中的双引号字符 " ,不能直接出现,必须用转义序列表示)。在后面那种情况,转义序列是一种由转义字符自身和一个被引用的字符组成的一个二合字母(digraph)情形。2
发展历史
转义字符在不同编程语言中的应用和历史发展是编程语言发展史上的一个重要里程碑。最初,在汇编语言等早期编程语言中,转义字符的概念并不明显,字符通常直接使用其字面意义。然而,随着C语言的出现,转义字符开始被广泛使用和标准化。C语言定义了一套标准的转义序列,如\n(换行)、\t(制表符)、\0(空字符)等,这些序列不仅在C语言中使用,也被后续的许多编程语言如C++、Java、C#等继承和扩展。随着Unicode的推广,现代编程语言如Java和C#开始支持Unicode转义序列,如\uXXXX,使得开发者可以在字符串中使用更广泛的字符集。此外,转义字符在Web开发中也扮演着重要角色,特别是在处理HTML和URL时,正确使用转义字符可以防止跨站脚本攻击(XSS)和确保数据的准确性。在正则表达式中,转义字符用于包含那些本身具有特殊含义的字符,如\.用于匹配实际的点字符。在命令行界面中,转义字符用于控制命令的执行和参数的处理,如在Bashshell中使用反斜杠来转义空格或其他特殊字符。
转义字符的应用贯穿了编程语言的各个方面,从基本的字符串处理到复杂的数据格式和安全防护,它们的发展和普及极大地丰富了编程语言的功能和灵活性。
控制字符
转义字符不属于控制字符;控制字符也不属于转义字符。如果控制字符的定义是非图形的字符,或者对输出设备(打印机、文本终端)有特殊意义的字符,那么针对这些设备的转义字符也是控制字符。但是程序设计用的转义字符是图形字符,因此它们不是控制字符。相反地,大多数ASCII控制字符单独都具有控制功能,因此它们不是转义字符。3
字符表
所有的转义字符和所对应的意义:
|| ||
注意:
1. 区分,斜杠:"/" 与 反斜杠:"\" ,此处不可互换
*2. \xhh 十六进制转义不限制字符个数 '\x000000000000F' == '\xF'*3
字符型常量
C语言中字符型常量所表示的值是int型所能包含的值。可以用ASCII表达式来表示一个字符型常量,或者用单引号内加反斜杠表示转义字符。
'A', '\x2f', '\013';
其中:\x表示后面的字符是十六进制数,\0表示后面的字符是八进制数。例如十进制的17用十六进制表示就是
‘\x11’,用八进制表示就是‘\021’;
上面我们见到的\x,\n,\a等等都是叫转义字符,它告诉编译器需要用特殊的方式进行处理。1
组成
转义字符串(Escape String),即字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand;第二部分是实体(Entity)名字或者是#加上实体(Entity)编号;第三部分是一个分号。
比如,要显示小于号(<),就可以写 < 或者 < 。
用实体(Entity)名字的好处是比较好理解,一看lt,大概就猜出是less than的意思,但是其劣势在于并不是所有的浏览器都支持最新的Entity名字。而实体(Entity)编号,各种浏览器都能处理。
提示:实体名称(Entity)是区分大小写的。
备注:同一个符号,可以用“实体名称”和“实体编号”两种方式引用,“实体名称”的优势在于便于记忆,但不能保证所有的浏览器都能顺利识别它,而“实体编号”则没有这种担忧,但它实在不方便记忆。1
编程语言
如HTML转义符、java 转义符、xml 转义符、 oracle 转义符、sql 转义符 、sqlserver 转义符、php 转义符、asp 转义符、vb转义符、 javascript 转义符等等,还有网址中的百分号。
例如,HTML的< >&"©分别是<,>,&,",©;的转义字符
XML只有5个转义符: < >& " '
编码与解码
转义字符有编码和解码过程,涉及到将特殊字符转换为可存储和传输的格式,以及将这些格式转换回原始字符。以下是一些基本的转义字符编码和解码的数学表示方法:
编码过程:
- 八进制表示法:
在C语言等编程语言中,可以使用八进制编码表示字符。例如,字符 A 在ASCII编码中的十进制值为65,可以转换为八进制表示 101。编码过程可以表示为: char=\Octal=\101。
- 十六进制表示法:
十六进制编码在现代编程语言中更为常见。字符可以通过\x 后跟两位十六进制数来表示。例如,字符 A 在ASCII编码中的十六进制表示为 41。编码过程可以表示为: char=\𝑥Hex=\𝑥41。
解码过程:
解码过程是将编码后的字符转换回其原始形式的过程:
1. 八进制解码:
将八进制编码的字符转换回其对应的ASCII字符。例如,\101 被解码为字符 A。
- 十六进制解码:
将十六进制编码的字符转换回其对应的ASCII字符。例如,\x41 被解码为字符 A。
作用
转义字符(Escape Sequence)也称字符实体(Character Entity),使用转义字符的原因基本上有两点:
- 表示字符集中未定义的字符: 使用转义字符来表示ASCII字符集中定义的控制字符及其他无法直接显示的字符,如回车、换行等。这些字符没有现成的文字代号,只能用转义字符来表示。
- 处理特殊用途字符: 某些特定字符在编程语言中被定义为特殊用途的字符,失去了其原有的意义。例如,在HTML中,“<”被定义为标签的开始符号,因此在文本中使用“<”时,需要用转义字符“<”来表示。同样,在PHP中,双引号(")被定义为字符串的外围符号,如果在字符串内部使用双引号,就需要使用转义字符(")来避免语法错误。
此外,某些脚本语言是弱类型语言,如HTML是标记语言,Shell脚本语言只有一种类型,这些语言中的字符串有时不需要加引号。因此,有时需要使用转义字符来明确某个字符的身份是普通字符,而不是具有特殊意义的元字符。
出于网站安全考虑,在数据写入数据库前,通常会使用转义字符(或相关函数)对一些敏感字符进行转义。这种做法可以防止一些别有用心的人利用特殊符号进行注入攻击,从而提高网站的安全性。
应用
1. 编程语言
在编程语言中,转义字符是处理字符串时不可或缺的工具。它们允许开发者在字符串中包含那些通常被保留用于语法结构的字符。例如,当需要在字符串中插入一个双引号时,可以使用\"来避免编译错误。此外,转义字符还用于表示那些在文本输出中不可见但具有特定功能的控制字符,如换行符\n和制表符\t。这些字符对于格式化文本输出至关重要,它们确保了程序的输出既符合预期又易于阅读。
2. 数据格式
在数据格式如JSON或XML中,转义字符的使用是为了确保数据的准确性和可读性。JSON格式要求对双引号、反斜杠等特殊字符进行转义,以避免解析错误。例如,\"用于包含字符串中的双引号,而\\用于包含反斜杠本身。XML则使用如<和>这样的转义序列来避免将文本解释为XML标签,从而保持数据的清晰和结构的完整性。这些转义规则对于数据的交换和存储至关重要,因为它们防止了数据的意外修改或错误解释。
3. 正则表达式
在正则表达式中,转义字符扮演着至关重要的角色。它们允许开发者在模式匹配中包含那些本身具有特殊含义的字符。例如,如果想匹配一个实际的点字符.,你需要使用\.来告诉正则表达式引擎这不是一个特殊字符,而是一个普通的点。同样,如果你想匹配圆括号(或),你需要使用\(和\)来创建一个分组。转义字符的使用确保了正则表达式的精确性和灵活性,使开发者能够构建复杂的文本匹配模式。
4. 命令行
在命令行界面(CLI)中,转义字符用于控制命令的执行和参数的处理。它们帮助用户在命令行中准确地表达他们的意图,尤其是在需要包含空格或其他特殊字符时。例如,在Bash shell中,使用反斜杠\来转义空格或其他特殊字符,从而保持参数的完整性。此外,转义字符还可以用于执行特殊命令,如\!用于访问历史命令。在文件路径中,转义字符可以用于表示目录分隔符或包含特殊字符的文件名,确保路径的正确解析和文件的准确访问4。
url
web 开发中通过英文问号(?)方式在浏览器地址栏中传值时。浏览器是通过“&”来区分问号后的参数个数的。 如果出现传值参数中带有“&”时,在接受页面就会出现错误,类似如下请求路径:/next.jsp?param1=hendhs89&furej & param2=sss
参数param1中含有转义字符“&” ,这样会导致被请求页的参数接收错误。
在传值前 通过 java.net.URLEncoder.encode(param1) 编码处理后,可将转义字符转为16进制;
|| ||
来源: 百度百科
内容资源由项目单位提供