1

我想将字符串(中文文本)导出到 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 文件中得到“类型”。

4

2 回答 2

1

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

于 2019-10-31T13:32:11.797 回答
1

首先,您肯定需要更改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 CentralGithub上找到

这是StringUnicodeEncoderDecoder类的 javadoc

我尝试了您的输入并得到了这个:

System.out.println(StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("类型"));
System.out.println(StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("类型"));

输出是:

\u7c7b\u578b
\u00e7\u00b1\u00bb\u00e5\u017e\u2039

所以看起来你确实丢失了信息,这不仅仅是一个显示问题

于 2019-10-31T13:51:04.417 回答