14

我有一个 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,并将字符编码更改为 UTF-8 chcp 65001

现在,当我运行时java -jar Read.jar file.txt,提示会挥霍这一点。

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

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

áéí
ñóú

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

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

4

3 回答 3

16

代码页 65001 已损坏。MS C 运行时 stdio 函数在 65001 下运行时返回读取和写入的字节数不准确,这会导致类似这样的奇怪行为。

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

这是一个长期存在的问题,MS 对修复没有兴趣。

于 2012-08-13T08:34:57.173 回答
0

看起来它可能是你换行符。当我在标准英语 ISO-8859-1 中制作换行符时,我使用 char[] 数组,因为 Windows 字符 '\r' 和'\n' 和 UNIX/Linux 仅 \r 作为换行符。赢得 4 个字节,unix 2 个字节。不是,在字符转换器类的 API 文档中,编码转换系统可能会留下虚假字节,以丢弃依赖于编码和字符大小要求的字节。

于 2012-08-13T02:39:20.460 回答
0

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

   BufferedReader in = new BufferedReader(
       new InputStreamReader(
                  new FileInputStream(file), "UTF8"));
于 2012-08-13T09:23:15.010 回答