標籤:常量 包括 特殊字元 轉換 編譯 控制 logs 精確 nic
JAVA中逸出字元:
1.八進位逸出序列:\ + 1到3位5數字;範圍‘\000‘~‘\377‘
\0:Null 字元
2.Unicode逸出字元:\u + 四個十六進位數字;0~65535
\u0000:Null 字元
3.特殊字元:就3個
\":雙引號
\‘:單引號
\\:反斜線
4.控制字元:5個
\‘ 單引號字元
\\ 反斜線字元
\r 斷行符號
\n 換行
\f 走紙換頁
\t 橫向跳格
\b 退格
點的轉義:. ==> \u002E
貨幣符號的轉義:$ ==> \u0024
乘方符號的轉義:^ ==> \u005E
左大括弧的轉義:{ ==> \u007B
左方括弧的轉義:[ ==> \u005B
左圓括弧的轉義:( ==> \u0028
豎線的轉義:| ==> \u007C
右圓括弧的轉義:) ==> \u0029
星號的轉義:* ==> \u002A
加號的轉義:+ ==> \u002B
問號的轉義:? ==> \u003F
反斜線的轉義: ==> \u005C
======================================================================
下面的程式使用了兩個Unicode的逸出字元,它們是用其十六進位代碼來表示Unicode字元。那麼,這個程式會列印什麼呢?
Java代碼
public class EscapeRout{
public static void main(String[] args){
// \u0022 是雙引號的Unicode逸出字元
System.out.println("a\u0022.length()
+\u0022b".length());
}
}
public class EscapeRout{
public static void main(String[] args){
// \u0022 是雙引號的Unicode逸出字元
System.out.println("a\u0022.length()
+\u0022b".length());
}
}
對該程式的一種很膚淺的分析會認為它應該列印出26,因為在由兩個雙引號"a\u0022.length()+\u0022b"標識的字串之間總共有26個字元。
稍微深入一點的分析會認為該程式應該列印16,因為兩個Unicode逸出字元每一個在源檔案中都需要用6個字元來表示,但是它們只表示字串中 的一個字元。因此這個字串應該比它的外表看其來要短10個字元。 如果你運行這個程式,就會發現事情遠不是這麼回事。它列印的既不是26也不是16,而是2。
理解這個謎題的關鍵是要知道:Java對在字串字面常量中的Unicode逸出字元沒有提供任何特殊處理。編譯器在將程式解析成各種符號之前, 先將Unicode逸出字元轉換成為它們所表示的字元[JLS 3.2]。因此,程式中的第一個Unicode逸出字元將作為一個單字元字串字面常量("a")的結束引號,而第二個Unicode逸出字元將作為另一 個單字元字串字面常量("b")的開始引號。程式列印的是運算式"a".length()+"b".length(),即2。
如果該程式的作者確實希望得到這種行為,那麼下面的語句將要清楚得多:
Java代碼
System.out.println("a".length()+"b".length());
更有可能的情況是該作者希望將兩個雙引號字元置於字串字面常量的內部。使用Unicode逸出字元你是不能實現這一點的,但是你可以使用轉義字 符序列來實現[JLS 3.10.6]。表示一個雙引號的逸出字元序列是一個反斜線後面緊跟著一個雙引號(\”)。如果將最初的程式中的Unicode逸出字元用逸出字元序列來 替換,那麼它將列印出所期望的16
(錯誤,應該是14,不知道是怎麼會出來16):
Java代碼
System.out.println("a\".length()+\"b".length());
許多字元都有相應的逸出字元序列,包括單引號(\‘)、換行(\n)、定位字元(\t)和反斜線(\\)。你可以在字元字面常量和字串字面常量中使用逸出字元序列。
實際上,你可以通過使用被稱為八進位逸出字元的特殊類型的逸出字元序列,將任何ASCII字元置於一個字串字面常量或一個字元字面常量中,但是最好是儘可能地使用普通的逸出字元序列。
普通的逸出字元序列和八進位逸出字元都比Unicode逸出字元要好得多,因為與Unicode逸出字元不同,逸出字元序列是在程式被解析為各種符號之後被處理的。
ASCII是字元集的最小公用特性集,它只有128個字元,但是Unicode有超過65,000個字元。一個Unicode逸出字元可以被用來在只使用ASCII字元的程式中插入一個Unicode字元。一個Unicode逸出字元精確地等價於它所表示的字元。
Unicode逸出字元被設計為用於在程式員需要插入一個不能用源檔案字元集表示的字元的情況。它們主要用於將非ASCII字元置於標識符、字元 串字面常量、字元字面常量以及注釋中。偶爾地,Unicode逸出字元也被用來在看起來頗為相似的數個字元中明確地標識其中的某一個,從而增加程式的清晰 度。
總之,在字串和字元字面常量中要優先選擇的是逸出字元序列,而不是Unicode逸出字元。Unicode逸出字元可能會因為它們在編譯序列中 被處理得過早而引起混亂。不要使用Unicode逸出字元來表示ASCII字元。在字串和字元字面常量中,應該使用逸出字元序列;對於除這些字面常量之 外的情況,應該直接將ASCII字元插入到源檔案中。
----------------------------------------------------------摘自網路java逸出字元對照表
點的轉義:. ==> u002E
貨幣符號的轉義:$ ==> u0024
乘方符號的轉義:^ ==> u005E
左大括弧的轉義:{ ==> u007B
左方括弧的轉義:[ ==> u005B
左圓括弧的轉義:( ==> u0028
豎線的轉義:| ==> u007C
右圓括弧的轉義:) ==> u0029
星號的轉義:* ==> u002A
加號的轉義:+ ==> u002B
問號的轉義:? ==> u003F
反斜線的轉義: ==> u005C
}
String str2="a$b$c"; String strs[]=str2.split("$"); for(String str:strs){ System.out.println(str); }
String str2="a$b$c"; String strs[]=str2.split("$"); for(String str:strs){ System.out.println(str); }
並不會打出 a , b ,c需要轉義才可如:
String str2="a$b$c"; String strs[]=str2.split("\\u0024"); for(String str:strs){ System.out.println(str); }
JAVA中逸出字元