Java 內部使用 UTF-16(char 類型佔 2 字節)表示字符,而 UTF-8 編碼中漢字通常佔 3 字節。這一差異常導致 I/O 操作時的亂碼問題。
OutputStreamWriter 或 String.getBytes(charset) 按指定編碼(如 UTF-8)轉為字節流。InputStreamReader 或 new String(bytes, charset) 從字節流解碼為 UTF-16 String。// 寫入文件指定 UTF-8
try (Writer w = new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8)) {
w.write("中文");
}
// 讀取指定編碼
String content = new String(Files.readAllBytes(Paths.get("in.txt")), StandardCharsets.UTF_8);
理解 Java 內部 UTF-16 與外部 UTF-8 的轉換邊界,並在所有 I/O 邊界顯式聲明編碼,是解決亂碼的根本之道。