簡體   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