2 回答

TA貢獻1765條經驗 獲得超5個贊
首先,您肯定需要更改zipOut.write("類型".getBytes());為zipOut.write("類型".getBytes(StandardCharsets.UTF_8));另外,當您打開生成的 CSV 文件時,編輯器可能不知道內容是以 UTF-8 編碼的。您可能需要告訴您的編輯器它是 UTF-8 編碼。例如,在記事本中,您可以使用“另存為”選項保存文件并將編碼更改為 UTF-8。此外,您的問題可能只是錯誤的顯示問題,而不是實際的編碼問題。有一個開源 Java 庫,其中有一個實用程序可以將任何字符串轉換為 Unicode 序列,反之亦然。當我診斷各種與字符集相關的問題時,這個實用程序多次幫助我。這是代碼的示例
result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);
這段代碼的輸出是:
\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World
該庫可以在Maven Central或Github上找到,它作為 Maven 工件提供,并帶有源代碼和 javadoc
這是StringUnicodeEncoderDecoder類的 javadoc
我嘗試了你的輸入并得到了這個:
System.out.println(StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("類型"));
System.out.println(StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("?±????"));
輸出是:
\u7c7b\u578b
\u00e7\u00b1\u00bb\u00e5\u017e\u2039
所以看來您確實丟失了信息,而且這不僅僅是顯示問題

TA貢獻1725條經驗 獲得超8個贊
該getBytes()
方法是罪魁禍首之一,如果沒有明確的字符集,它就會采用機器的默認字符集。根據 JavaString
文檔:
getBytes()
使用平臺的默認 charset?將此 String 編碼為字節序列,并將結果存儲到新的字節數組中。
getBytes(string charsetName)
使用給定的 charset?將此 String 編碼為字節序列,并將結果存儲到新的字節數組中。
此外,正如 @Slaw 指出的那樣,請確保使用文件所在的相同編碼來編譯(?javac -encoding <encoding>
) 文件:
-encoding設置源文件編碼名稱,例如 EUC-JP 和 UTF-8。如果未指定 -encoding,則使用平臺默認轉換器。
順便說一句,closeEntry()
OP 中缺少對 的調用。我將代碼片段精簡為我認為實現所需功能所必需的內容。
????try?(FileOutputStream?fileOut?=?new?FileOutputStream("out.zip"); ????????ZipOutputStream?zipOut?=?new?ZipOutputStream(fileOut))?{ ????????zipOut.putNextEntry(new?ZipEntry("chinese.csv")); ????????zipOut.write("類型".getBytes("UTF-8")); ????????zipOut.closeEntry(); ????}
最后,正如 @MichaelGantman 指出的,您可能需要使用十六進制編輯器等工具檢查編碼的內容,同時排除您查看結果文件的編輯器以錯誤的方式顯示正確的 utf-8方式。utf-8中的“類”是(十六進制),e7 b1 bb
utf-16(java默認編碼)中是7c 7b
添加回答
舉報