首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java字符串寫入文件後讀出equals比較失敗:字符編碼與String構造差異

     編輯:程式設計綜合問答

現象

字符數組構造String寫入文件,讀出後與直接字面量"?"用equals比較返回false,但字符內容看起來相同。

根因分析

  1. 字符編碼不一致:FileWriter默認平台編碼(Windows GBK,Linux UTF-8),寫入的字節序列與讀取時FileReader解碼產生的字符可能不同。
  2. 不可打印字符/控制字符:代碼中s[k] = (char)(s[k] + p[k%m])可能生成非BMP字符、代理對或控制字符,顯示為?但實際碼點不同。
  3. String.equals語義:逐字符比較char[](UTF-16碼單元),碼點不同即返回false。

驗證代碼

// 寫入前
System.out.println("str bytes: " + Arrays.toString(str.getBytes("UTF-8")));
// 讀出後
System.out.println("sss bytes: " + Arrays.toString(sss.getBytes("UTF-8")));
// 對比碼點
for (int i = 0; i < Math.min(str.length(), sss.length()); i++) {
    if (str.charAt(i) != sss.charAt(i))
        System.out.printf("Diff at %d: str=U+%04X, sss=U+%04X%n", i, (int)str.charAt(i), (int)sss.charAt(i));
}

解決方案

  1. 顯式指定編碼:
    FileWriter fw = new FileWriter(file, StandardCharsets.UTF_8); // Java 11+
    // 或
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
    
  2. 避免不可打印字符**:加密/變換邏輯確保結果在可打印範圍(如Base64、Hex編碼)。
  3. 測試用Files.readString(Path, StandardCharsets.UTF_8)**(Java 11+)統一讀寫編碼。

關鍵認知

「寫入讀出內容相同」≠「equals返回true」**。equals比較的是UTF-16碼單元序列,編碼轉換、不可打印字符、字節序標記(BOM)均可能導致碼點差異。調試時**打印字節數組/碼點**而非依賴控制台顯示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved