1

我用 Java 编写了一个应用程序并用 C# 复制了它。该应用程序读取和写入带有制表符分隔数据的文本文件,以供 HMI 软件使用。HMI 软件需要 UTF 或 ANSI 编码才能正确显示度数符号,否则我只会使用似乎可以正常工作的 ASCII。C# 应用程序可以毫无问题地打开任何一个保存的文件。java 应用程序可以完美地读取它保存的文件,但是在读取用 C# 保存的文件时会出现一个小问题。将文件中的第一个字符解析为 int 时会引发 numberformatexception。该字符始终为“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));
    }
4

2 回答 2

1

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

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

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

这有点像第 22 条军规;如果源有 BOM,那么您可以将其读取为“UTF-16”。如果不是,那么您可以将其读取为“UTF-16LE”或“UTF-16BE”,因为您知道它是哪个。

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

使用 BOM:

[C#]

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

[爪哇]

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

没有 BOM:

[C#]

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

[爪哇]

FileUtils.readLines(file, "UTF-16LE"); 
于 2018-12-05T02:31:11.633 回答
0

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

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

    br = new BufferedReader(fis);

    String line = br.readLine();
于 2021-12-09T12:29:09.400 回答