Puzzle 14: Escape Rout

Unicode逃逸符和程序源码

\u0022 是双引号(“)的Unicode逃逸字符, 下面两句程序是等同的.

  1. System.out.println("a\u0022.length() + \u0022b".length());
  2. System.out.println("a".length() + "b".length());

所以都输出2 (“a”的长度1加上“b”的长度1).

Java编译器会在解析程序之前将Unicode逃逸字符替换成它代表的原字符(JLS 3.2). 那么, 在编译之前"a\u0022.length() 实际上已经被替换成第二行的形式: "a".length().

对于程序员来说, 使用ASCII 码的地方, 根本没必要使用Unicode逃逸字符. 在源码中能使用Unicode逃逸字符的初衷是为了表达那些源码中无法书写的字符–直接用它们的Unicode表示之. 如在仅支持英文的平台上书写包含中文的程序.

Java的字节码是16位的Unicode. Java程序的原码是基于何种码制并无规定, 往往使用GBK写出含有中文的源码在Big5平台上编译后出现乱码. 但有一种方式可以防止乱码, 那就是程序中使用中文的地方都用所谓的Unicode escapes字符代替.

  1. JLS 3.2 Lexical Translations
  2. JLS 3.10.6 Escape Sequences for Character and String Literals