java - 随机访问文件和 UTF 8 行

标签 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 是相同的:重音字符保持像 é 而不是 é。未进行任何转换。

最佳答案

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

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/

相关文章:

asp-classic - ASP Classic 正确处理使用 UTF-8 保存的文件

delphi - Delphi 6 可以将 UTF-8 葡萄牙语转换为 WideString 吗?

java - java中根据文件名模式获取最新文件

java - Sybase ASE 到 HSQLDB JUnit java.sql.SQLSyntaxErrorException : type not found or user lacks privilege

java - 查找坐标是否为顶点/边界坐标的有效方法?

gradle - 从 gradle/groovy 中的路径创建目录结构

java - 如何删除Android中谷歌地图上显示的路线?

jenkins - 如何在类里面使用 Jenkins 的内置方法?

java - 重用java业务逻辑

javascript 编码URI() 输出