随机存取文件和 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)
}
我的问题是 utfLine
和 line
是一样的:重音字符保持像 É 而不是 é。没有完成转换。
首先,这行代码什么也没做。数据是一样的。删除它:
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");
我使用 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')
根据 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");