RandomAccesFile和UTF8行

时间:2016-08-28 14:51:46

标签: java groovy utf-8 randomaccessfile

我使用RandomAccessFile对象来读取UTF-8法语文件。我使用readLine方法。

我的Groovy代码如下:

while ((line = randomAccess.readLine())) {
    def utfLine = new String(line.getBytes('UTF-8'), 'UTF-8')
    ++count
    long nextRecordPos = randomAccess.getFilePointer()

    compareNextRecords(utfLine, randomAccess)

    randomAccess.seek(nextRecordPos)
}

我的问题是utfLineline是相同的:重音字符保持é而不是é。没有转换。

1 个答案:

答案 0 :(得分:2)

首先,这行代码绝对没有任何意义。数据是一样的。删除它:

def utfLine = new String(line.getBytes('UTF-8'), 'UTF-8')

根据Javadoc,RandomAccessFile.readLine()不知道字符编码。它会读取字节,直到遇到“\ r”或“\ n”或“\ r \ n”。 ASCII字节值以正常方式放入返回的字符串中。但是128到255之间的字节值按字面意思放入字符串中,而不是将其解释为字符编码(或者你可以说这是原始/逐字编码)。

没有方法或构造函数在RandomAccessFile中设置字符编码。但是使用readLine()仍然很有价值,因为它负责解析换行序列并分配内存。

在您的情况下最简单的解决方案是通过反转readLine()所做的事情,手动将伪“行”转换为字节,然后将字节解码为具有字符编码意识的实际字符串。我不知道如何在Groovy中编写代码,所以我将在Java中给出答案:

String fakeLine = randomAccess.readLine();
byte[] bytes = new byte[fakeLine.length()];
for (int i = 0; i < fakeLine.length(); i++)
    bytes[i] = (byte)fakeLine.charAt(i);
String realLine = new String(bytes, "UTF-8");