使用 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
保存的文件有什么区别
Screen Shot of Data in 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");
有点像第二十二条军规;如果源代码有 BOM,那么您 可以 将其读取为 "UTF-16"。如果不是,那么您 可以 将其读作 "UTF-16LE" 或 "UTF-16BE",因为您知道它是哪个。
因此,要么使用 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 中指定了字符编码
File file = new File(fileName);
InputStreamReader fis = new InputStreamReader(new FileInputStream(file), "UTF-16LE");
br = new BufferedReader(fis);
String line = br.readLine();
我用 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
保存的文件有什么区别Screen Shot of Data in 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");
有点像第二十二条军规;如果源代码有 BOM,那么您 可以 将其读取为 "UTF-16"。如果不是,那么您 可以 将其读作 "UTF-16LE" 或 "UTF-16BE",因为您知道它是哪个。
因此,要么使用 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 中指定了字符编码
File file = new File(fileName);
InputStreamReader fis = new InputStreamReader(new FileInputStream(file), "UTF-16LE");
br = new BufferedReader(fis);
String line = br.readLine();