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条经验 获得超7个赞
该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
添加回答
举报