我使用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)
}
我的问题是utfLine
和line
是相同的:重音字符保持é而不是é。没有转换。
答案 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");