我有一个 jar 文件,它应该读取一个 UTF-8 编码的文件——我在 Windows 下的文本编辑器中编写的——并将字符显示到屏幕上。在 OS X 和 Linux 下,这可以完美运行。不过,我在让它在 Windows 下工作时遇到了一些麻烦......我已经定义了一个读取器和写入器:
FileInputStream file = new FileInputStream(args[0]);
InputStreamReader reader = new InputStreamReader(file, "UTF8");
PrintStream writer = new PrintStream(System.out, true, "UTF8");
我还按顺序将命令提示符字体更改为 Lucida Console
并将字符编码更改为 UTF-8 和 chcp 65001
。
现在,当我运行 java -jar Read.jar file.txt
时,提示会显示这一点。
áéí
ñóú
[]óú
[]
但是,如果我运行 type file.txt
,提示会正确显示文件的内容。
áéí
ñóú
我尝试过使用和不使用 BOM 来保存我的文件,但这并没有什么不同。 (UTF-8 甚至不需要 BOM,因为它缺乏字节顺序,对吗?)我尝试使用 javac -encoding utf8 *.java
进行编译,但同样的事情发生了。
我现在没主意了。有人愿意帮忙吗?
最佳答案
代码页 65001 已损坏。当在 65001 下运行时,MS C 运行时标准输入输出函数返回不准确的字节读取和写入计数,这会导致像这样的奇怪行为。
它不可修复 - 您无法可靠地使用 Windows 控制台从使用 C stdlib 字节 I/O 函数(包括 Java)的应用程序中进行 Unicode I/O。您可以通过调用 Win32 API 函数 WriteConsoleW 将 Unicode 内容直接获取到控制台来破解它,但是您必须担心检测 stdout 何时实际上是一个控制台(未重定向到文件)。
这是一个长期存在的问题,MS 没有兴趣修复它。
关于Java、Unicode、UTF-8 和 Windows 命令提示符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11927518/