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

时间:2012-08-13 02:23:48

标签: 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,并使用chcp 65001将字符编码更改为UTF-8。

现在,当我运行java -jar Read.jar file.txt时,提示会将其消除。

áéí
ñóú
[]óú
[]

但是,如果我运行type file.txt,则提示正确显示文件的内容。

áéí
ñóú

我尝试使用和不使用BOM保存我的文件,但这没有什么区别。 (UTF-8甚至不需要BOM,因为它缺乏字节序,对吗?)我尝试用javac -encoding utf8 *.java编译,但同样的事情发生了。

我现在没有想法了。有人在乎帮忙吗?

3 个答案:

答案 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"));