我有两个文本文件,我提供了下载链接而不是 pastebin,以便准确保存其内容:
这两个文本文件都只包含空格、回车符、换行符和字母 X,并且它们应该是 ASCII 编码的。这两个文件之间的唯一区别是第二个文件删除了前导和尾随的空白行,并且删除了每行上的一些前导和尾随空格。
第一个文件没有引起任何问题。出于某种原因,我的文本编辑器检测到第二文件为 UTF-8:
- 双击文本文件打开记事本时,显示损坏的文本:
- 记事本在使用文件 → 打开时,只要我明确选择“ANSI”,就可以正常工作:
- Notepad++ 在正常显示文件的同时,认为它被编码为“UTF-8(无BOM)”:
在 Notepad++ 中,即使我选择“转换为 ANSI”并保存文件,保存的文件与原始文件逐字节相同,并且两个编辑器仍然将其检测为 UTF-8!
两个编辑器对第一个文件都没有问题并且正确将其识别为 ASCII(或 ANSI)。
我在十六进制编辑器中查看了第二个文本文件。确实,它不是以 BOM 开头的。文件的前几个字节是20 20 20 20 20 20 20 20
,正如所料,因为它以空格开头:
我的问题是:那么,为什么 Notepad 和 Notepad++ 都将第二个文件检测为 UTF-8?假设该文件没有 BOM 标头,为什么会发生这种情况?与第一个文件相比,第二个文件有何独特之处导致这种情况?我不明白发生了什么。
答案1
这两个文件都是有效的 ASCII和UTF-8 因为它们只包含 < 0x7F 的代码点(换句话说,没有一个字节的值大于 127)。
我的猜测是 Notepad++ 和 Notepad 有不同的启发式方法 [如果多种编码有效]:
N++ 只是更喜欢 UTF-8,
记事本(Win 实用程序)似乎会查看文件长度 - 如果是甚至(作为第二个文件,大小为 72,320 字节)然后将其视为 UTF-16(本机 Windows 编码,主要为 2 个字节 [并非总是如此,但它可能是从早期的 UCS-2 继承而来,始终为两个字节]),如果它是奇怪的(作为您的第一个文件 - 78 045 字节)将其视为 ASCII(单字节)。
您可以通过在第一个文件末尾添加单个空格(或任何其他有效的 ascii 字符)来测试它,以使长度均匀 - 如果您在记事本中打开它,它会假定它是 Unicode 并显示“垃圾”
顺便提一句:在我的电脑上,这两个文件在 Notepad++ 中都被识别为 utf-8