源代码中的字符转义

发表评论 阅读评论

作为一个程序员写代码是每天必做的事,当需要在一个字符串里包含一个换行符时,我们会使用n来表示,而不是在编辑器里敲一个回车,这时n就是一个字符转义,它代表了编码为10的换行符。当我们加载内容为n的文件时,这个文件有2个字符,并且跟换行没有任何关系。

源代码与普通文本

接上面的,虽然我们在源代码和加载来的普通文件里都包含n这是2个字符,但是他们被程序输出的却完全不同。当源代码没有被编译时,与普通文本没有任何区别。一旦被编译了,就会有些东西被转义,比如说数值123456789,当他们没被编译时,他们就是普通的字符串,占9个字节,当被编译为数值int后,变成int类型的数值,占4个字节。
通常会被转义的有:

  • 数值(十进制) 123 还是数值 123
  • 数值(八进制) 0123 变成十进制的 83 注(AS中会忽略前面的0,并当做十进制数)
  • 数值(十六进制) 0x123 变成十进制的 293
  • 字符串() 字符串里通常使用反斜杠(\)后接一个字符来转义,比如rntf 当要转义的序列不被支持时,AS将自动忽略
  • 字符串() 后直接换行,表示忽略及后面的回车和换行,用于在多行中写一行的字符串
  • 字符串(xXX) 用2个十六进制编码表示ASCII字符 AS不支持,会将直接忽略
  • 字符串(xx) 用最多3个八进制编码表示ASCII字符 AS不支持,效果同上
  • 字符串(uxxxx) 用4个十六进制编码表示unicode字符 AS不支持,效果同上

以上这些数值和字符串的转义一定要搞清楚。当直接使用创建正则表达式(非构造函数创建)时,任何字符都不会被转义,但是由构造函数创建的时候,传递的字符串遵循上面的转义原则,因为仅仅是字符串。例如下面的代码输出结果相同。

trace(/s/.source);
trace((new RegExp("\s").source);

以上的AS3代码将输出:

s
s

后话

关于字符编码的,不同的语言对不同的转义的支持度不同。对不支持的转义的处理效果也不同,比如在Java中出现不支持的转义序列时会报错,C++会部分报错,AS3直接忽略掉。
所以在写代码的时候,如果对于不明白的转义,要么规避,要么测试下再写。其实大部分的都不常用。

标签: ,

  1. | |

    各系统的换行符也不一样,另外转义字符很烦,另外说下python这处理字符串比较牛

  2. | |

    @walfred
    我这里不是说的字符串处理,是说的代码中的字符串跟普通的文件文件不同的,代码经过编译或者运行环境解释后将拥有不同的意义。不懂python,不过搜了下python的字符串处理,发现果然强大。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部