Java,Unicode,UTF-8和Windows命令提示符
问题内容:
我有一个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运行时stdio函数返回的字节读取和写入的计数不正确,这会导致类似这样的奇怪行为。
它不是可修复的-您不能从使用C stdlib字节I / O函数(包括Java)的应用程序中可靠地使用Windows控制台进行Unicode I /
O。您可以通过调用Win32
API函数WriteConsoleW来破解它,以将Unicode内容直接发送到控制台,但是随后您就不得不担心检测stdout何时实际上是一个控制台(未重定向到文件)。
这是一个长期的祸患,MS对修复没有兴趣。