包含日文字符的Java读取文件[重复]

Posted

技术标签:

【中文标题】包含日文字符的Java读取文件[重复]【英文标题】:Java reading file containing japanese characters [duplicate] 【发布时间】:2019-11-19 18:12:27 【问题描述】:

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

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?

【问题讨论】:

@RuelosJoel 为什么默认不采用 UTF-8? 【参考方案1】:

不,readString 是一种过时的方法,仍然在字符集/编码等之前。它将每个字节转换为高字节 0 的字符。字节 0x85 是行分隔符 (EBCDIC NEL),如果它是在某些 UTF-8 多字节序列中,则实际行将分为两行。还有一些场景是可行的。

最好使用Files。它有一个 newBufferedReader(path, Charset) 和一个 fixed 默认字符集 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 基本上是用于二进制数据的。

【讨论】:

【参考方案2】:

它看起来像是 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);

【讨论】:

以上是关于包含日文字符的Java读取文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

读取和修改文件夹中的每个文件 - Java [重复]

具有 hsqldb 脚本文件的唯一约束违规异常(未读取空格字符)

无法读取日志文件并加载到 db java [重复]

java如何读取InputStream中的字符串

Java,读取两个文件A,B并且进行处理,把B里所有包含A内容的字符全去掉....好的追分,求高手指点,谢谢

java怎么在xml文件中保存和读取字符串数组