繁体   English   中英

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

[英]Problem parsing unicode escape in a Java 6 String literal…?

为什么要在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");

这里发生了什么?

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

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

所以你的代码实际上相当于:

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

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

我个人认为这种处理Unicode转义是Java中的一个缺陷,但现在我们无法做很多事情:(

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

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

如果我没有弄错,为了避免预处理我们可以通过更改以下行来解决它:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM