编码为UCS-2的文件Little Endian向Java报告的线路数量太多

时间:2012-04-09 07:51:10

标签: java character-encoding

我正在用一个简单的Java程序处理几个txt文件,我的过程的第一步是计算每个文件的行:

int count = 0;
br = new BufferedReader(new FileReader(myFile)); // myFile is the txt file in question
while (br.readLine() != null) {
    count++;
}

对于我的一个文件,Java的数量恰好是实际数量的两倍!起初这让我很困惑。我在Notepad ++中打开了每个文件,可以看到错误计数文件以与其他文件完全相同的方式结束每一行,使用CR和LF。我做了一些更多的探索并注意到我所有的“ok”文件都是ANSI编码的,并且一个问题文件编码为UCS-2 Little Endian(我对此一无所知)。我把这些文件放在其他地方,所以我不知道为什么这个文件被编码,但当然把它转换为ANSI修复了这个问题。

但现在好奇心依然存在。为什么编码导致双行计数报告?

谢谢!

2 个答案:

答案 0 :(得分:10)

简单:如果在读取UCS-2(或UTF-16)文本(例如ANSI或任何8位编码)时应用了错误的编码,则每隔一个字符为0x0。然后将CR-LF分解为CR-0-LF,这被视为两行变化(一个用于CR,一个用于LF)。

答案 1 :(得分:9)

这是问题所在:

new FileReader(myFile)

那将使用平台默认编码。不要这样做。使用

new InputStreamReader(new FileInputStream(myFile), encoding)

其中encoding是文件的适当编码。您必须使用正确的编码,否则您将无法正确读取文件。不幸的是,当然依赖于你知道编码......

编辑:回答为什么线条被重复计算而不仅仅是"我如何修复它的问题",请参阅Lucero的回答:)