繁体   English   中英

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

[英]Reading and Writing Text files with UTF-16LE encoding and Apache Commons IO

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

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

Integer.parseInt(line[0])

我看不出用 C# 保存的文件和用 Java 保存的文件有什么区别

EditPad Lite 中数据的屏幕截图

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

您的.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"); 

没有物料清单:

[C#]

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

[Java]

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

在我的java代码中我正常读取文件,我只是在InputStreamReader中指定了char编码

    File file = new File(fileName);
    InputStreamReader fis = new InputStreamReader(new FileInputStream(file), "UTF-16LE");

    br = new BufferedReader(fis);

    String line = br.readLine();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM