Java: ZipOutputStream 和 UTF-8 编码的问题
Java: Problems with ZipOutputStream and UTF-8 encoding
我目前无法让 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) {}
}
该代码压缩所有 xml 文件以及 UTF-8
中的数据文件。但只要我 运行 它在我的 Eclipse-IDE 中。一旦我将它放入 运行nable jar 并在 Eclipse 之外 运行 它就不再能够以 UTF-8
编码写入文件。
可能有用的信息:
代码来自旧的 maven 项目,我已将编译器设置为 Java 1.8。但是由于我没有使用 Maven 的实际经验,我不知道那里是否还有其他问题。
这是我的第一个 Whosebug 问题,正如你们可能看到的那样,我并不是那么有经验。如果我忘记提供任何其他重要信息,请告诉我。
您在调用 getBytes()
时未指定编码,这可能是问题的根源。
永远不要调用 String.getBytes()
(或 new String(byte[])
),因为它很乐意使用平台默认编码,但不能保证总是如您所愿.
将 quest.getSceneSource(scene).getBytes()
更改为 quest.getSceneSource(scene).getBytes(StandardCharsets.UTF_8)
并修复您的 quest.getConfigAsBytes()
所以它 return 不只是 任何 字节,而是UTF-8
字节。
我目前无法让 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) {}
}
该代码压缩所有 xml 文件以及 UTF-8
中的数据文件。但只要我 运行 它在我的 Eclipse-IDE 中。一旦我将它放入 运行nable jar 并在 Eclipse 之外 运行 它就不再能够以 UTF-8
编码写入文件。
可能有用的信息:
代码来自旧的 maven 项目,我已将编译器设置为 Java 1.8。但是由于我没有使用 Maven 的实际经验,我不知道那里是否还有其他问题。
这是我的第一个 Whosebug 问题,正如你们可能看到的那样,我并不是那么有经验。如果我忘记提供任何其他重要信息,请告诉我。
您在调用 getBytes()
时未指定编码,这可能是问题的根源。
永远不要调用 String.getBytes()
(或 new String(byte[])
),因为它很乐意使用平台默认编码,但不能保证总是如您所愿.
将 quest.getSceneSource(scene).getBytes()
更改为 quest.getSceneSource(scene).getBytes(StandardCharsets.UTF_8)
并修复您的 quest.getConfigAsBytes()
所以它 return 不只是 任何 字节,而是UTF-8
字节。