我有一个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
,并使用chcp 65001
将字符编码更改为UTF-8。
现在,当我运行java -jar Read.jar file.txt
时,提示会将其消除。
áéí
ñóú
[]óú
[]
但是,如果我运行type file.txt
,则提示正确显示文件的内容。
áéí
ñóú
我尝试使用和不使用BOM保存我的文件,但这没有什么区别。 (UTF-8甚至不需要BOM,因为它缺乏字节序,对吗?)我尝试用javac -encoding utf8 *.java
编译,但同样的事情发生了。
我现在没有想法了。有人在乎帮忙吗?
答案 0 :(得分:14)
代码页65001已损坏。 MS C运行时stdio函数返回在65001下运行时读取和写入的字节计数不准确,这会导致像这样的奇怪行为。
无法修复 - 您无法从使用C stdlib字节I / O函数(包括Java)的应用程序中可靠地使用Windows控制台进行Unicode I / O.您可以通过调用Win32 API函数WriteConsoleW直接将Unicode内容提供给控制台来破解它,但是您必须担心检测stdout实际上何时是控制台(未重定向到文件)。
这是一个长期存在的祸患,MS对修复没有兴趣。
答案 1 :(得分:0)
看起来它可能是换行符。当我使用标准英语ISO-8859-1制作换行符时,我使用char []数组,因为Windows字符'\ r'和'\ n'以及UNIX / Linux仅作为换行符\ r \ n。赢4个字节,unix 2个字节。 在字符转换器类的API文档中,编码转换系统可能会遗留掉丢弃的字节,从而依赖于编码和字符大小要求。
答案 2 :(得分:0)
尝试使用BufferReader来读取你的文件;
BufferedReader in = new BufferedReader(
new InputStreamReader(
new FileInputStream(file), "UTF8"));