天天看點

java中的特殊字元集合

JAVA中轉義字元:

1.八進制轉義序列:\ + 1到3位5數字;範圍\'\000\'~\'\377\'

      \0:空字元

2.Unicode轉義字元:\u + 四個

十六進制數字;0~65535

     \u0000:空字元

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字元插入到源檔案中