Java、Unicode、UTF-8和Windows命令提示符
我有一个jar文件,它应该读取我在Windows下的文本编辑器中编写的UTF-8编码文件,并将字符显示在屏幕上。在OSX和Linux下,这项工作完美无瑕。我有点麻烦让它在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
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)//谢谢,但是提示仍然有问题。我在网上看到其他地方的支持被破坏了,但我拒绝相信。唉。不幸的是,我认为你是对的。