Java 对 Unicode 转义字符不会进行任何特殊的处理,只是简单的将其替换称相应的字符!
因此,在编写代码时,任何出现 Unicde 字符串的地方,都要额外注意,倍加小心,要知道 Java 词法是如何解析的?转移后的代码是否合法?逻辑上是否正确?
Unicode 特殊字符 | 含义 |
---|---|
\u000a | 换行符 \n |
\u007d | { |
\u007b | } |
\u0022 | " |
\u002b | + |
示例一 :
public void test(){
// 这是注释\u000a System.out.println("被注释的代码,不应该打印");
}
执行上面的函数,会发现,被注释掉的代码竟然被执行了,因为 \u000a 出现在代码中,在词法解析时,此处发生了换行,而解析后得到的代码如下:
public void test(){
// 这是注释
System.out.println("被注释的代码,不应该打印");
}
因此,后面的代码会被执行。
示例二:
public void test2(){
System.out.println("5 + 10 = \u0022+ (5+10) + \u0022");
}
打印的信息为 5 + 10 = 15
,因为字符串中添加了 unicode 字符,被解析后得到的真实函数如下:
public void test2(){
System.out.println("5 + 10 = " + (5+10) + "");
}
因此代码执行的结果会有所不同。
也正是因为如此,当字符串中出现 \u000a
时,会出现编译错误,报错的内容为: java: 未结束的字符串文字
或 illegal escape character in string literal
例如:
public void test2(){
System.out.println("\u000a"); // 编译错误
}