随机存取文件和 UTF 8 行

RandomAccesFile and UTF8 line

我使用 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 是一样的:重音字符保持像 É 而不是 é。没有完成转换。

首先,这行代码什么也没做。数据是一样的。删除它:

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

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

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

根据您的情况,最简单的解决方案是通过反转 readLine() 所做的操作,手动将伪造的 "line" 转换为字节,然后在了解字符编码的情况下将字节解码为真正的字符串。我不会在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");