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

Java、Unicode、UTF-8和Windows命令提示符,java,windows,unicode,utf-8,command-prompt,Java,Windows,Unicode,Utf 8,Command Prompt,我有一个jar文件,它应该读取我在Windows下的文本编辑器中编写的UTF-8编码文件,并将字符显示在屏幕上。在OSX和Linux下,这项工作完美无瑕。我有点麻烦让它在Windows下工作,虽然。。。我对读者和作者的定义如下: FileInputStream file = new FileInputStream(args[0]); InputStreamReader reader = new InputStreamReader(file, "UTF8"); PrintStream write

我有一个jar文件,它应该读取我在Windows下的文本编辑器中编写的UTF-8编码文件,并将字符显示在屏幕上。在OSX和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表和没有BOM表的文件,但都没有什么不同。(UTF-8甚至不需要BOM,因为它缺少端号,对吗?)我尝试过用
javac编译-编码utf8*.java
,但同样的情况也发生了


我现在没有主意了。有人愿意帮忙吗?

看来可能是你的新行字符。当我使用标准英语ISO-8859-1创建换行符时,我使用char[]数组,因为windows字符“\r”和“\n”以及UNIX/Linux仅\r作为换行符。赢4个字节,unix赢2个字节。
A不,在字符转换器类的API文档中,编码转换系统可能会有多余的字节,以根据编码和字符大小要求进行丢弃。

代码页65001被破坏。MSC运行时stdio函数在65001下运行时返回不准确的读写字节数,这会导致类似这样的奇怪行为

它是不可修复的-您无法从使用C stdlib字节I/O函数(包括Java)的应用程序可靠地使用Windows控制台进行Unicode I/O。您可以通过调用Win32 API函数WriteConsoleW将Unicode内容直接发送到控制台来破解它,但是您必须担心检测stdout实际上是控制台(而不是重定向到文件)的时间


这是一个长期存在的问题,微软对解决这个问题不感兴趣。

尝试使用BufferReader这样读取您的文件

   BufferedReader in = new BufferedReader(
       new InputStreamReader(
                  new FileInputStream(file), "UTF8"));

如果将输出重定向到文件,则输出文件是否与输入文件相同?如果没有,有什么不同?您是否使用写入(缓冲区,0,字节读取)来输出数据?通过
type file.txt>file2.txt
重定向将生成具有所有正确字符的完全相同的文件。
write
方法是写入文件,是吗?我使用文本编辑器编写输入文件,而不是通过代码。我的意思是,当您使用printwriter将输入文件写入控制台时,您使用读取缓冲区rgt!现在,您正在执行类似于byte[]byteBuff=new byte[10]的操作;intbread=file.read(byteBuff);writer.write(byteBuff,0,bread)//谢谢,但是提示仍然有问题。我在网上看到其他地方的支持被破坏了,但我拒绝相信。唉。不幸的是,我认为你是对的。