为什么文本编辑器认为这个文件是 UTF-8?

Jas*_*n C 6 windows-7 unicode text-editors

我有两个文本文件,我提供下载链接而不是 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 标头,为什么会发生这种情况,与导致此问题的第一个文件相比,第二个文件有何独特之处?我无法弄清楚发生了什么。

wmz*_*wmz 7

这两个文件都是有效的 ASCIIUTF-8,因为它们只包含 <0x7F 的代码点(换句话说,没有一个字节的值大于 127)。

我的猜测是 Notepad++ 和 Notepad 具有不同的启发式[如果多个编码有效]:

N++ 更喜欢 UTF-8,

记事本(Win 实用程序)似乎查看文件长度 - 如果它是偶数(作为您的第二个文件,它是 72 320 字节)而不是将其视为 UTF-16(本机 Windows 编码,主要是 2 个字节[并非总是如此,但它是可能是从早期的 UCS-2 继承下来的,它总是两个字节]),如果它是奇数(作为您的第一个文件 - 78 045 个字节),则将其视为 ASCII(单字节)。

您可以通过在第一个文件的末尾添加单个空格(或任何其他有效的 ascii 字符)来测试它以使长度均匀 - 如果您在记事本中打开它,它将假定它是 Unicode 并显示“垃圾”

顺便说一句:这两个文件在我的 PC 上的 Notepad++ 中都被识别为 utf-8