如何理解Java程序使用Unicode字符集編寫

Java採用UTF-16編碼做爲內碼,也就是說在JVM內部,文本是用16位碼元序列表示的,經常使用的文本就是字符(char)和字符串(String)字面常量的內容。注:UTF-16是Unicode字符集的一種編碼方案。java

Java字符和字符串存在於如下幾個地方:c++

  • Java源碼文件,*.java,能夠是任意字符編碼,如GBK,UTF-8
  • Class文件,*.class,採用的是一種改進的UTF-8編碼(Modified UTF-8)
  • JVM,內存中使用UTF-16編碼

Java編譯器須要正確的讀取源碼,消除編碼差別,而後編譯成UTF-8編碼的Class文件。好比javac,默認狀況下它會取操做系統的編碼,能夠使用參數-encoding指定源碼文件的字符編碼。JVM加載Class文件,把其中的字符或字符串轉成UTF-16編碼序列。編程

Java中涉及編碼的類主要有String和IO包中的字節字符轉換流。String.getBytes()使用JVM啓動時得到的字符集來編碼字符串,也能夠使用getBytes(charset)指定字符集;字節就是單純的01,但轉成字符時就要有字符集的概念了,IO包中的InputStreamReaderOutputStreamWriter,是字節流和字符流的橋樑,默認使用JVM默認字符集對字符解碼和編碼,能夠經過構造方法指定字符集。xcode

String str = "創";
str.getBytes("UTF-8"); // 3字節,0xE5889B
str.getBytes("UTF-16"); // 2字節,0x521B

InputStreamReader(InputStream, charset);
OutputStreamWriter(OutputStream, charset);

FAQ

1. Java中的字符主要有哪些?

Java編程語言主要有如下幾種字符:markdown

  • 空白字符:空格、製表符、換頁符和行終止符
  • 註釋:/text/ or // text
  • 符號
    • 標識符:就是變量名和類名,其中的字母和數字能夠從Unicode字符集中提取,也就是說能用本地語言編寫標識符,如String 名字="cxcoder";
    • 關鍵字:好比class,new
    • 字面常量:簡單類型、String、空類型在源碼中的表示
    • 分隔符:也叫標點符號,() {} [] ; , . ... @
    • 操做符:邏輯和算術運算符
  • 轉義字符
    • Unicode轉義字符:經過\u+4個十六進制數使用任何Unicode字符
    • 字面常量轉義字符:\b \t \n \f \r \" \' \\不使用Unicode轉義字符也能表示一些特殊字符

2. 解釋一下程序的輸出結果

String hello = "Hello", lo = "lo";
System out print(hello == "Hello"); // true 一個字符串字面常量老是引用String的同一個實例
System out print(hello == ("Hel" +"lo")): // true 常量表達式,編譯時得出結果,當作字面常量對待 System out print(hello == ("Hel"+1o)); // false 運行時鏈接運算產生新String對象
System out println(hell0 == ("Hel"+lo).intern()); // true 查找常量池是否有此字符串,有返回,無放進去,以前已定義intern返回同一個String實例

3. Java中的null如何理解?

null看起來是關鍵字,但從技術上講,它僅僅是空字面常量,表示空引用。像true/false也只是布爾字面常量。app

相關文章
相關標籤/搜索