为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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条经验 获得超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 bbutf-16(java默认编码)中是7c 7b


查看完整回答
反对 回复 2024-01-17
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信