我使用 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
是相同的:重音字符保持像 é 而不是 é。未进行任何转换。
最佳答案
首先,这行代码绝对没有执行任何操作。数据是一样的。删除它:
def utfLine = new String(line.getBytes('UTF-8'), 'UTF-8')
根据 Javadoc,RandomAccessFile.readLine()
不知道字符编码。它读取字节直到遇到“\r”或“\n”或“\r\n”。 ASCII 字节值以正常方式放入返回的字符串中。但是 128 到 255 之间的字节值会按字面意思放入字符串中,而不会将其解释为字符编码(或者您可以说这是原始/逐字编码)。
没有方法或构造函数可以在 RandomAccessFile
中设置字符编码。但使用 readLine() 仍然很有值(value),因为它负责解析换行序列并分配内存。
在您的情况下,最简单的解决方案是通过反转 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");
关于java - 随机访问文件和 UTF 8 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39192507/