记事本将 txt 文件内容显示为奇怪的符号

记事本将 txt 文件内容显示为奇怪的符号

我正在使用类似这样的方法将整数值从 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 看起来像这样var2textfile_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。)

相关内容