我正在使用類似的方法將整數值從 kotlin (kotlin Int 類型)寫入文件
var1BufferedWriter?.write(String.format("%d\n", intvar ) )
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )
var1
上面被寫入textfile.txt
和var2
。textfile_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。)