Java、Unicode、UTF-8 和 Windows 命令提示符

标签 java windows unicode utf-8 command-prompt

我有一个 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/

相关文章:

python - 我如何让我的 Python 程序解压缩我拖过的压缩文件?

c# - 在印度语言的 c# 中将 Unicode 字符串转换为 unicode 字符

IDE 内和外的 Python Unicode

c++ - 如何创建隐藏目录

java - 在 Java 中将文件读入 byte[] 数组的优雅方法

java - 如何将 boolean 表达式转换为cnf文件?

java - 等待 Java 线程池中的线程子集

windows - 在 Windows 10 分配的访问权限中运行 Chrome 信息亭模式

html - 如何在没有危险设置InnerHTML的情况下在React中渲染HTML实体?

javax.el.PropertyNotFoundException : Property 'id' not found on type model. 杂货店