代码之家  ›  专栏  ›  技术社区  ›  Dafydd Rees

在Java6字符串文本中解析unicode转义时出现问题…?

  •  10
  • Dafydd Rees  · 技术社区  · 14 年前

    为什么要在Java6(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 回复  |  直到 14 年前
        1
  •  18
  •   Jon Skeet    14 年前

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

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

    所以你的密码是 事实上 相当于:

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

    就我个人而言,我认为Unicode转义的处理是Java中的一个缺陷,但现在我们对此无能为力:(

        2
  •  3
  •   Jigar Joshi    14 年前

    Unicode转义在词法分析之前展开。 见JLS 3.2。

        3
  •  1
  •   punkers    14 年前

    这是因为\u000a=\n编译器处理java源代码以便将其转换为标记,所以不能在代码中使用该unicode字符。同样适用于\u000d=\r

        4
  •  0
  •   sabadow    12 年前

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

    其局限性在于 CHAR ,它的分机将从0扩展到255。