亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 ZipEntry 中書寫漢字?

如何在 ZipEntry 中書寫漢字?

至尊寶的傳說 2024-01-17 16:46:31
我想將字符串(中文文本)導出到 zip 文件內的 CSV 文件。哪里需要將編碼設置為UTF-8?或者我應該采取什么方法(基于下面的代碼)在導出的CSV文件中顯示中文字符?這是我目前擁有的代碼。        ByteArrayOutputStream out = new ByteArrayOutputStream();        ZipOutputStream zipOut = new ZipOutputStream(out, StandardCharsets.UTF_8)        try {            ZipEntry entry = new ZipEntry("chinese.csv");            zipOut.putNextEntry(entry);            zipOut.write("類型".getBytes());        } catch (IOException e) {            e.printStackTrace();        } finally {            zipOut.close();            out.close();        }我在 CSV 文件中得到的是“?±???”,而不是“類型”。
查看完整描述

2 回答

?
POPMUISE

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

所以看來您確實丟失了信息,而且這不僅僅是顯示問題


查看完整回答
反對 回復 2024-01-17
?
qq_遁去的一_1

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 bbutf-16(java默認編碼)中是7c 7b


查看完整回答
反對 回復 2024-01-17
  • 2 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號