windows记事本中奇怪的utf8解码错误

windows记事本中奇怪的utf8解码错误,windows,utf-8,character-encoding,notepad,Windows,Utf 8,Character Encoding,Notepad,如果您在一个用utf8编码的文本文件(不带bom)中键入以下字符串,并用notepad.exe打开它,您将在屏幕上看到一些红色字符。但记事本实际上可以很好地解码这个字符串,而不需要最后一个“a”。非常奇怪的行为。我使用的是Windows101809 [19, 16, 12, 14, 15, 15, 12, 17, 18, 15, 14, 15, 19, 13, 20, 18, 16, 19, 14, 16, 20, 16, 18, 12, 13, 14, 15, 20, 19, 17, 14,

如果您在一个用utf8编码的文本文件(不带bom)中键入以下字符串,并用notepad.exe打开它,您将在屏幕上看到一些红色字符。但记事本实际上可以很好地解码这个字符串,而不需要最后一个“a”。非常奇怪的行为。我使用的是Windows101809

[19, 16, 12, 14, 15, 15, 12, 17, 18, 15, 14, 15, 19, 13, 20, 18, 16, 19, 14, 16, 20, 16, 18, 12, 13, 14, 15, 20, 19, 17, 14, 17, 18, 16, 13, 12, 17, 14, 16, 13, 13, 12, 15, 20, 19, 15, 19, 13, 18, 19, 17, 14, 17, 18, 12, 15, 18, 12, 19, 15, 12, 19, 18, 12, 17, 20, 14, 16, 17, 18, 15, 12, 13, 19, 18, 17, 18, 14, 19, 18, 16, 15, 18, 17, 15, 15, 19, 16, 15, 14, 19, 13, 19, 15, 17, 16, 12, 12, 18, 12, 14, 12, 16, 19, 12, 19, 12, 17, 19, 20, 19, 17, 19, 20, 16, 19, 16, 19, 16, 12, 12, 18, 19, 17, 18, 16, 12, 17, 13, 18, 20, 19, 18, 20, 14, 16, 13, 12, 12, 14, 13, 19, 17, 20, 18, 15, 12, 15, 20, 14, 16, 15, 16, 19, 20, 20, 12, 17, 13, 20, 16, 20, 13a

我想知道这是否是windows的错误,或者我可以做些什么来解决这个问题。

做了更多的研究;我明白了

似乎是“布什隐瞒事实”这一经典案例的变体。

看起来记事本保存文件的默认字符编码与打开文件的默认字符编码不同。是的,这看起来确实像个虫子

但对正在发生的事情有一个实际的解释:

  • 记事本检查BOM字节序列。如果找不到,则有2个选项:编码为UTF-16小端(无BOM)或纯ASCII。它首先使用名为ISTEXTINCODE的函数检查UTF-16 LE

  • IStextNicode运行一系列测试来猜测给定文本是否为Unicode。其中一个测试是使用统计分析的“文本”统计。如果测试结果为真,那么给定的文本可能是Unicode,但不能保证绝对确定性。

  • 如果istextanicode返回true,记事本将使用UTF-16 LE对文件进行编码,生成您看到的奇怪输出。 我们可以用这个字符来证实这一点ㄠ. 其对应的ASCII字符为“1”(空格1);这些ASCII字符的对应十六进制值为0x20表示空格,0x31表示一个空格。由于字节顺序是Little Endian,Unicode代码点的顺序将是“1”,或U+3120,如果您查找该代码点,您可以确认该顺序。

  • 如果您想解决这个问题,您需要打破有助于ISTEXTINCODE确定给定文本是否为Unicode的模式。您可以在文本前插入换行符以打破模式


    希望有帮助

    做了更多的研究;我明白了

    似乎是“布什隐瞒事实”这一经典案例的变体。

    看起来记事本保存文件的默认字符编码与打开文件的默认字符编码不同。是的,这看起来确实像个虫子

    但对正在发生的事情有一个实际的解释:

  • 记事本检查BOM字节序列。如果找不到,则有2个选项:编码为UTF-16小端(无BOM)或纯ASCII。它首先使用名为ISTEXTINCODE的函数检查UTF-16 LE

  • IStextNicode运行一系列测试来猜测给定文本是否为Unicode。其中一个测试是使用统计分析的“文本”统计。如果测试结果为真,那么给定的文本可能是Unicode,但不能保证绝对确定性。

  • 如果istextanicode返回true,记事本将使用UTF-16 LE对文件进行编码,生成您看到的奇怪输出。 我们可以用这个字符来证实这一点ㄠ. 其对应的ASCII字符为“1”(空格1);这些ASCII字符的对应十六进制值为0x20表示空格,0x31表示一个空格。由于字节顺序是Little Endian,Unicode代码点的顺序将是“1”,或U+3120,如果您查找该代码点,您可以确认该顺序。

  • 如果您想解决这个问题,您需要打破有助于ISTEXTINCODE确定给定文本是否为Unicode的模式。您可以在文本前插入换行符以打破模式


    希望有帮助

    似乎记事本将其解释为整个字符串的固定2字节,因此在内部将其转换为UCS-2。[19,16,12,1映射到ㅛ ⰹ ㄠ ⰶ ㄠ ⰲ ㄠ , 所以第一个角色实际上是[1',第二个是'9',第三个是'1',等等。因此,当您删除最后一个'a',它无法将其编码为2字节字符。很抱歉,如果上面的内容令人困惑。我只理解位和段。仍在尝试解决所有问题。记事本似乎将其解释为整个字符串的固定2字节,因此在内部将其转换为UCS-2。[19,16,12,1映射到ㅛ ⰹ ㄠ ⰶ ㄠ ⰲ ㄠ , 因此,第一个字符实际上是“[1”,第二个是“9”,第三个是“1”,等等。所以当你删除最后一个“a”时,它不能将其编码为2字节字符。如果上面的内容令人困惑,我很抱歉。我只理解比特和片段。仍在努力解决所有问题。