Java采用UTF-16編碼作為內碼,也就是說在JVM內部,文本是用16位碼元序列表示的,常用的文本就是字符(char)和字符串(String)字面常量的內容。注:UTF-16是Unicode字符集的一種編碼方案。
Java字符和字符串存在於以下幾個地方:
- 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包中的InputStreamReader
和OutputStreamWriter
,是字節流和字符流的橋梁,默認使用JVM默認字符集對字符解碼和編碼,可以通過構造方法指定字符集。
String str = "創";
str.getBytes("UTF-8"); // 3字節,0xE5889B
str.getBytes("UTF-16"); // 2字節,0x521B
InputStreamReader(InputStream, charset);
OutputStreamWriter(OutputStream, charset);
FAQ
1. Java中的字符主要有哪些?
Java編程語言主要有以下幾種字符:
- 空白字符:空格、制表符、換頁符和行終止符
- 注釋:/text/ or // text
- 符號
- 標識符:就是變量名和類名,其中的字母和數字可以從Unicode字符集中提取,也就是說能用本地語言編寫標識符,如
String 名字="cxcoder";
- 關鍵字:比如class,new
- 字面常量:簡單類型、String、空類型在源碼中的表示
- 分隔符:也叫標點符號,
() {} [] ; , . ... @
- 操作符:邏輯和算術運算符
- 標識符:就是變量名和類名,其中的字母和數字可以從Unicode字符集中提取,也就是說能用本地語言編寫標識符,如
- 轉義字符
- 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
也只是布爾字面常量。