記事本將 txt 檔案內容顯示為奇怪的符號

記事本將 txt 檔案內容顯示為奇怪的符號

我正在使用類似的方法將整數值從 kotlin (kotlin Int 類型)寫入文件

var1BufferedWriter?.write(String.format("%d\n", intvar ) )   
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )    

var1上面被寫入textfile.txtvar2textfile_hex.txt兩者都保存到 Android 手機 SD 卡內存中。當我將它們複製到 Windows PC 並在記事本中打開它們時,textfile.txt 看起來像這樣

在此輸入影像描述

而 textfile_hex.txt 看起來像這樣:

在此輸入影像描述

如果我在十六進位編輯器中開啟 textfile.txt,我可以看到文件中的所有資料都是正確的以及我期望的資料。 Notepad++ 也能正確顯示所有內容。奇怪的是,我在周末之前使用了同一個應用程式來產生許多其他類似於 textfile.txt 的文件,並且它們在 Windows 中看起來都很正常。 Android 或記事本設定中沒有任何變更。

這是正常行為嗎?這是某種程式設計問題嗎?為什麼記事本來可以正確顯示某些 txt 文件,而其他文件則不能?

Windows 版本:
Windows 10 專業
版 22H2
作業系統版本 19045.4046
體驗 Windows 功能體驗套件 1000.19053.1000.0

答案1

該文件會觸發假陽性在記事本的「Is Unicode」檢測中。 (這個問題甚至有它自己的維基百科頁面.)

  • 如果您的 'intvar' 始終為零,則該檔案完全由重複組成,它以 ASCII(和/或 UTF-8)"0\n"格式儲存為位元組。{0x30, 0x0A}

    "0"  "\n"  "0"  "\n"  "0"  "\n"  ...
    30   0A    30   0A    30   0A    ...
    
  • 您看到的是 Unicode 字元"ਰ"aka "\u0A30"akaU+0A30,即{0x30, 0x0A}以 UTF-16 LE格式儲存為位元組。

    "ਰ"     "ਰ"     "ਰ"    ...
    30 0A   30 0A   30 0A  ...
    

稍微改變輸出——例如添加某種「明顯是 ASCII」的標題或註釋——可以解決這個問題。

您還可以為文件內容添加前綴"\xEF\xBB\xBF"(或"\uFEFF",以Java/Kotlin 喜歡的拼寫為準),這是標準標頭,指示文件為UTF-8,並且會導致記事本(以及所有其他文本編輯器)跳過自動檢測。

如果Android支援它,你可以讓它將檔案寫為實際的UTF-16(最好包含 BOM,這樣就可以繞過這部分格式偵測)。

(您的其他檔案可能不會觸發該問題,因為它們至少有一個值 ≥10,這會「錯位」位元組,使偵測程式碼看起來更像 ASCII,而不那麼像 UTF-16。)

相關內容