解析Java 6字符串文字中的unicode转义问题...?

时间:2010-10-25 08:30:03

标签: java unicode java-6

为什么要在java 6(Sun 1.6.0_16)中编译:

System.out.println("\u000B");

......但不是这样:

System.out.println("\u000A");

关于此计划:

public class Test {
  public static void main(String argv[]) {
  System.out.println("\u000A");
  }
}

我得到了

Test.java:3: unclosed string literal
System.out.println("\u000A");

这里发生了什么?

4 个答案:

答案 0 :(得分:18)

问题是Unicode替换是在编译的早期完成的。 Unicode转义不仅在字符串和字符文字中有效(如\t之类的其他转义序列) - 它们在代码中的任何地方有效。它们在规范的不同区域描述 - section 3.3而不是section 3.10.6;只有后者是字符和字符串文字转义序列。

基本上,请阅读规范的第3部分,了解有关词法结构的更多细节:)

所以你的代码实际等同于:

public class Test {
  public static void main(String argv[]) {
  System.out.println("
");
  }
}

...这显然不是有效的代码。对于回车和换行,基本上最好使用“\ r”和“\ n”转义序列。

我个人认为这种处理Unicode转义是Java中的一个缺陷,但我们现在对它的处理并不多:(

答案 1 :(得分:3)

  

在词法分析之前扩展Unicode转义。   Unicode转义出现在字符串文字中的事实是无关紧要的。   见JLS 3.2。

答案 2 :(得分:1)

这是因为\ u000a = \ n并且编译器处理java源代码以将其转换为标记,因此您不能在代码中使用该unicode字符。 \ u000d = \ r

也是如此

答案 3 :(得分:1)

如果我没有弄错,为了避免重新处理,我们可以通过更改以下内容来解决这个问题:

System.out.println((char)10);

限制是,通过成为CHAR,它的扩展名将为0到255.