簡體   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