簡體   English   中英

無法在 Android 版本 9 上使用編碼 UTF-16LE

[英]Unable to use encoding UTF-16LE on Android Version 9

我有一個創建 csv 文件的應用程序。 然后該文件由 excel makro 導入。 makro 需要使用 UTF-16LE 編碼對文件進行編碼。 問題是,我無法在某些設備上使用這種編碼。

到目前為止,我使用字符集 UTF-16 來創建文件。 當我用記事本++打開文件時,它顯示文件是用UTF-16LE編碼的。 現在我有了一個新設備,當我用它創建 csv 文件時,notepad++ 顯示編碼是 UTF-16BE。 結果,當我嘗試使用 excel makro 導入文件時出現錯誤。

我試圖將編碼指定為 UTF-16LE,根據 android 的開發者頁面,它應該是一個有效的字符集。 但是記事本++無法識別我的文件的編碼,並且excel makro無法讀取它(對於舊設備和新設備)。

我能夠通過 notepad++ 將兩種情況下的編碼轉換為 UTF-16LE 並使用我的 makro 成功導入文件,但我需要以正確的格式從我的應用程序創建文件。

較舊的設備具有 android 版本5.1

較新的設備具有 android 版本9.0

這是我的代碼:

File file = new File("some_name");
if (file.exists()) {
    file.delete();
}
file.getParentFile().mkdirs();
file.createNewFile();

Writer osw = new OutputStreamWriter(new FileOutputStream(file),"UTF-16LE"); //Or "UTF-16"
osw.write("foo");
osw.write("bar");
osw.close();

如何在新設備上使用 UTF-16LE 編碼?


我確實看了這個答案並像這樣實現了它:

Writer osw = new OutputStreamWriter(new FileOutputStream(file),"UTF-16LE"); //Or "UTF-16"
osw.write(new String(("foo").getBytes("UTF-16LE"), "UTF-16LE"));
osw.write(new String(("bar").getBytes("UTF-16LE"), "UTF-16LE"));
osw.close();

我也使用了StandardCharsets.UTF_16LE但它沒有改變任何東西。 notepad++ 仍然無法識別編碼,並且不會被 makro 導入。

您可以嘗試使用指定編碼的字節順序標記 (bom) 顯式強制 UTF-16LE 編碼。 Notepad++ 以及 Excel 可以解釋 bom。 例如,以下代碼將生成一個適合使用字節順序標記導入 Excel 的 csv 文件:

public void writeFile(Context context) throws IOException {
    File file = new File(context.getFilesDir(), "some_name.csv");
    if (file.exists()) file.delete();

    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_16LE);

    // The byte order mark for UTF-16 is "\ufeff" but will appear as "\ufffe" when
    // the file is UTF-16LE.
    osw.write("\ufeff");
    osw.write("Header1,Header2,Header3,Header4\n");
    osw.write("text1,text2,text3,text4\n");
    osw.write("text5,text6,text7,text8");
    osw.close();
}

在 Android 9 模擬器上生成的結果文件如下所示:

PS C:\> format-hex some_name.csv

           Path: C:\some_name.csv

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   FF FE 48 00 65 00 61 00 64 00 65 00 72 00 31 00  .þH.e.a.d.e.r.1.
00000010   2C 00 48 00 65 00 61 00 64 00 65 00 72 00 32 00  ,.H.e.a.d.e.r.2.
00000020   2C 00 48 00 65 00 61 00 64 00 65 00 72 00 33 00  ,.H.e.a.d.e.r.3.
00000030   2C 00 48 00 65 00 61 00 64 00 65 00 72 00 34 00  ,.H.e.a.d.e.r.4.
00000040   0A 00 74 00 65 00 78 00 74 00 31 00 2C 00 74 00  ..t.e.x.t.1.,.t.
00000050   65 00 78 00 74 00 32 00 2C 00 74 00 65 00 78 00  e.x.t.2.,.t.e.x.
00000060   74 00 33 00 2C 00 74 00 65 00 78 00 74 00 34 00  t.3.,.t.e.x.t.4.
00000070   0A 00 74 00 65 00 78 00 74 00 35 00 2C 00 74 00  ..t.e.x.t.5.,.t.
00000080   65 00 78 00 74 00 36 00 2C 00 74 00 65 00 78 00  e.x.t.6.,.t.e.x.
00000090   74 00 37 00 2C 00 74 00 65 00 78 00 74 00 38 00  t.7.,.t.e.x.t.8.

Notepad++ 解釋文件是這樣的:

在此處輸入圖片說明

導入文件后,Excel 顯示如下:

在此處輸入圖片說明

這不會直接回答您的問題,但您應該能夠將此代碼與您的數據一起使用來幫助診斷問題。

我在評論中留下了這一點,但我會在這里再次提及:UTF 解碼器的行為確實隨着 Android 9 發生了變化,變得更加符合 Unicode 標准。 此處描述這些更改。 不確定這會對您的情況產生什么影響(如果有),但值得一看(IMO)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM