【问题标题】:Java: Problems with ZipOutputStream and UTF-8 encodingJava:ZipOutputStream 和 UTF-8 编码的问题
【发布时间】:2020-06-15 12:54:06
【问题描述】:

在某些情况下,我目前无法让 ZipOutputStream 正确编码 UTF-8 中的 xml 文件。

以下是相关代码:

     public void saveQuest(File selectedFile) {

        try {
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(selectedFile + ".zip"), StandardCharsets.UTF_8);

            out.putNextEntry(new ZipEntry(".data"));
            out.write(quest.getConfigAsBytes());
            for (String scene : quest.getSceneNames()) {
                out.putNextEntry(new ZipEntry(scene+".xml"));
                out.write(quest.getSceneSource(scene).getBytes());
            }
            out.flush();

        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {out.close();} catch(IOException e) {}
    }

该代码压缩了UTF-8 中的所有xml 文件以及一个数据文件。但只要我在我的 Eclipse-IDE 中运行它。一旦我将它放入一个可运行的 jar 并在 Eclipse 之外运行它,它就不再能够以UTF-8 编码写入文件。

可能有用的信息:

代码来自一个旧的 maven 项目,我已将编译器设置为 Java 1.8。但由于我对 Maven 没有真正的经验,我不知道那里是否还有其他问题。

这是我的第一个 stackoverflow 问题,正如你们可能看到的那样,我并不是很有经验。如果我忘记提供任何其他重要信息,请告诉我。

【问题讨论】:

    标签: java utf-8 zipoutputstream


    【解决方案1】:

    您在没有指定编码的情况下调用getBytes(),这可能是您的问题的根源。

    永远不要打电话给String.getBytes()(或new String(byte[])),因为它很乐意使用平台默认编码,但不能保证始终如您所愿。

    quest.getSceneSource(scene).getBytes() 更改为quest.getSceneSource(scene).getBytes(StandardCharsets.UTF_8) 并修复您的quest.getConfigAsBytes(),使其不只返回任何 个字节,而是返回UTF-8 字节。

    【讨论】:

    • 谢谢好心的先生,这确实解决了问题!
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 2010-12-01
    • 1970-01-01
    • 2013-03-26
    • 2018-02-18
    相关资源
    最近更新 更多