java - 如何在 ZipEntry 中书写汉字?

标签 java character-encoding zipoutputstream

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

最佳答案

首先,您肯定需要将 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

看来您确实丢失了信息,而且这不仅仅是显示问题

关于java - 如何在 ZipEntry 中书写汉字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58644054/

相关文章:

java - 在Java中重写domain类的equals()和hashCode()方法

java - 异步任务错误 #1 和 Internet 权限

java - 从远程电脑获取系统时间

Java8 FileSystems.getDefault 抛出 UnsupportedCharsetException

java - ZipEntry 的默认大小是多少

Java - try-with-resources 中的 ZipOutputStream

java - 如何更新firebase数据库特定键中的值

grails - 如果参数文本为ASCII,则将Grails空间解码为加号

python - 在 Python 中将 Unicode 转换为 ASCII 而不会出错

android - 将文件插入现有的 .APK