使用UTF-16LE编码和Apache Commons IO读写文本文件

时间:2018-12-04 20:41:32

标签: java c# utf-16le

我已经用Java编写了一个应用程序,并用C#复制了它。该应用程序读取和写入带有制表符分隔数据的文本文件,以供HMI软件使用。 HMI软件要求UTF或ANSI编码才能正确显示度数符号,否则我将只使用ASCII似乎工作正常。 C#应用程序可以毫无问题地打开任何一个保存的文件。 Java应用程序会读取它完美保存的文件,但是在读取用C#保存的文件时会出现一个小问题。将文件中的第一个字符解析为and int时,它将引发numberformatexception。此字符始终为“ 1”。我已经使用editpadlight打开了这两个文件,即使使用编码查看并且编码为UTF-16LE,它们看起来也一样。我为此竭尽全力,任何帮助将不胜感激。

lines = FileUtils.readLines(file, "UTF-16LE");

Integer.parseInt(line[0])

我看不到C#中保存的文件和Java中保存的文件之间的任何区别

Screen Shot of Data in EditPad Lite

        if(lines.get(0).split("\\t")[0].length() == 2){
        lines.set(0, lines.get(0).substring(1));
    }

1 个答案:

答案 0 :(得分:0)

您的.NET代码可能正在编写BOM。兼容的Unicode阅读器会删除任何BOM,因为它是元数据,而不是文本数据的一部分。

您的Java代码明确指定了字节顺序

FileUtils.readLines(file, "UTF-16LE"); 

有点像Catch-22;如果源中有BOM,则您可以 将其读取为“ UTF-16”。如果不是,则可以将其读取为“ UTF-16LE”或“ UTF-16BE”,因为这是事实。

因此,要么用BOM写入并在不指定字节顺序的情况下读取它,要么不使用BOM写入并在指定字节顺序的情况下读取它。

使用BOM表:

[C#]

File.WriteAllLines(file, lines, Encoding.Unicode);

[Java]

FileUtils.readLines(file, "UTF-16"); 

没有BOM表:

[C#]

File.WriteAllLines(file, lines, new UnicodeEncoding(false));

[Java]

FileUtils.readLines(file, "UTF-16LE");