包含日语字符的Java读取文件

时间:2019-07-10 07:11:56

标签: java encoding utf-8 iso-8859-1

我正在尝试读取包含一些日语字符的文件。

RandomAccessFile file = new RandomAccessFile("japanese.txt", "r");
String line;
while ((line = file.readLine()) != null) {
   System.out.println(line);
}

它返回一些乱码而不是日语。 但是当我转换编码时,它会正确打印。

line = new String(line.getBytes("ISO-8859-1"), "UTF-8");

这是什么意思?文本文件是否采用ISO-8859-1编码?

$ file -i japanese.txt返回以下信息:

japanese.txt: text/plain; charset=utf-8

请解释明确要求文件将拉丁1转换为UTF-8的内容吗?

2 个答案:

答案 0 :(得分:2)

否,readString是一种过时的方法,仍早于字符集/编码等。它将每个字节转换为具有高字节0的char。字节0x85是行分隔符(EBCDIC NEL),如果它采用某些UTF-8多字节序列,则实际的行将分为两行。还有更多可行的方案。

最佳使用Files。它具有一个newBufferedReader(path, Charset)和一个固定默认字符集UTF-8。

Path path = Paths.get("japanese.txt");
try (BufferedReader file = Files.newBufferedReader(path)) {
    String line;
    while ((line = file.readLine()) != null) {
        System.out.println(line);
    }
}

现在您将阅读正确的字符串。

RandomAccessFile本质上是用于二进制数据的

答案 1 :(得分:1)

它看起来像是ISO,但我会尝试使用该编码进行阅读,看看会发生什么情况。

由于您不进行随机访问,因此我只创建具有正确编码的BufferedReader并使用它:

String charSetName = // either UTF-8 or iso - try both
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, Charset.forName(charSetName));
BufferedReader reader = new BufferedReader(isr);

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}