特殊字符在JavaIDE中显示正确,但在从jar文件启动的程序中不显示



我正在尝试用Java构建一个中文抽认卡程序来帮助自己学习中文。我正在使用intelliJ IDEA 10。基本过程是,我的程序将读取保存在本地机器上的文件,以生成抽认卡。该文件是使用java中的file类编写的。当在记事本中打开时,它会正确显示所有字符。

当我在IDE中运行它时,我可以显示汉字和拼音字符(基本上是带有重音符号的元音)。然而,当我构建了一个jar文件并从那里启动程序时,它无法再显示特殊字符,最终显示了一堆奇怪的符号。

有什么关于为什么会这样以及如何解决的想法吗?

IntelliJ不使用平台默认编码,而是根据源文件的编码自动检测。在IntelliJ外部运行代码时,需要确保在读取/写入文件时显式指定正确的编码。您可以通过将其分别指定为InputStreamReaderOutputStreamWriter的第二构造函数参数来实现这一点。

File file = new File("/foo.txt");
Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
// ...
Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
// ...

此外,您还需要确保查看器也支持字体。例如,Windows命令控制台不支持中文。您需要创建一个Swing应用程序来显示结果。

可能是编码问题?

File类没有任何将数据写入文件的方法。为此,您需要一个FileOutputStream或一些Writer。您应该发布保存文件的代码。(只需编辑问题并在那里添加代码即可。)

我的第一个猜测是你用的是FileWriter。这听起来很容易,但通常是错误的,因为FileWriter需要将字符转换为字节,而它使用系统的默认编码来实现这一点。您应该始终自己指定编码,UTF-8可能是一个不错的选择。

因此,您应该使用以下代码来代替FileWriter

Charset utf8 = Charset.forName("UTF-8");
OutputStream os = new FileOutputStream(file);
try {
  Writer wr = new OutputStreamWriter(os, utf8);
  wr.write("whatever strings you want to write");
  wr.close();
} finally {
  os.close();
}

最新更新