我正在使用类似这样的方法将整数值从 kotlin (kotlin Int 类型)写入文件
var1BufferedWriter?.write(String.format("%d\n", intvar ) )
var2BufferedWriter?.write(String.format("%08x\n", intvar ) )
var1
上面的内容被写入textfile.txt
和。两者都保存在安卓手机 SD 卡内存中。当我将它们复制到 Windows PC 并在记事本中打开时,textfile.txt 看起来像这样var2
textfile_hex.txt
而 textfile_hex.txt 看起来像这样:
如果我在十六进制编辑器中打开 textfile.txt,我可以看到文件中的所有数据都是正确的,并且符合我的预期。Notepad++ 也能正确显示所有内容。奇怪的是,周末之前我曾使用过同一个应用程序生成许多类似于 textfile.txt 的其他文件,它们在 Windows 中看起来都很正常。Android 或记事本设置中没有任何变化。
这是正常现象吗?这是某种编码问题吗?为什么记事本可以正确显示某些 txt 文件,而不能正确显示其他文件?
Windows 版本:
版本 Windows 10 Pro
版本 22H2
OS 内部版本 19045.4046
体验 Windows 功能体验包 1000.19053.1000.0
答案1
该文件触发假阳性在记事本的“是否为 Unicode”检测中。(这个问题甚至它有自己的维基百科页面。
如果您的“intvar”始终为零,则该文件完全由重复组成,以ASCII(和/或 UTF-8)中的
"0\n"
字节存储。{0x30, 0x0A}
"0" "\n" "0" "\n" "0" "\n" ... 30 0A 30 0A 30 0A ...
您看到的是 Unicode 字符,
"ਰ"
又称"\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。)