Java 字符操作

編碼與解碼

編碼就是把字符轉換爲字節,而解碼是把字節重新組合成字符。

如果編碼和解碼過程使用不同的編碼方式那麼就出現了亂碼。

  • GBK 編碼中,中文字符佔 2 個字節,英文字符佔 1 個字節;
  • UTF-8 編碼中,中文字符佔 3 個字節,英文字符佔 1 個字節;
  • UTF-16be 編碼中,中文字符和英文字符都佔 2 個字節。

UTF-16be 中的 be 指的是 Big Endian,也就是大端。相應地也有 UTF-16le,le 指的是 Little Endian,也就是小端。

Java 的內存編碼使用雙字節編碼 UTF-16be,這不是指 Java 只支持這一種編碼方式,而是說 char 這種類型使用 UTF-16be 進行編碼。char 類型佔 16 位,也就是兩個字節,Java 使用這種雙字節編碼是爲了讓一箇中文或者一個英文都能使用一個 char 來存儲。

String 的編碼方式

String 可以看成一個字符序列,可以指定一個編碼方式將它編碼爲字節序列,也可以指定一個編碼方式將一個字節序列解碼爲 String。

String str1 = "中文";
byte[] bytes = str1.getBytes("UTF-8");
String str2 = new String(bytes, "UTF-8");
System.out.println(str2);

在調用無參數 getBytes() 方法時,默認的編碼方式不是 UTF-16be。雙字節編碼的好處是可以使用一個 char 存儲中文和英文,而將 String 轉爲 bytes[] 字節數組就不再需要這個好處,因此也就不再需要雙字節編碼。getBytes() 的默認編碼方式與平臺有關,一般爲 UTF-8。

byte[] bytes = str1.getBytes();Copy to clipboardErrorCopied

Reader 與 Writer

**不管是磁盤還是網絡傳輸,最小的存儲單元都是字節,而不是字符。**但是在程序中操作的通常是字符形式的數據,因此需要提供對字符進行操作的方法。

  • InputStreamReader 實現從字節流解碼成字符流;
  • OutputStreamWriter 實現字符流編碼成爲字節流。

實現逐行輸出文本文件的內容

public static void readFileContent(String filePath) throws IOException {

    FileReader fileReader = new FileReader(filePath);
    BufferedReader bufferedReader = new BufferedReader(fileReader);

    String line;
    while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    }

    // 裝飾者模式使得 BufferedReader 組合了一個 Reader 對象
    // 在調用 BufferedReader 的 close() 方法時會去調用 Reader 的 close() 方法
    // 因此只要一個 close() 調用即可
    bufferedReader.close();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章