Python 3.x 如何从É;ph和xC3©;mè;回复至É;ph&xE9;mè;你在蟒蛇3号吗?

Python 3.x 如何从É;ph和xC3©;mè;回复至É;ph&xE9;mè;你在蟒蛇3号吗?,python-3.x,utf-8,character-encoding,Python 3.x,Utf 8,Character Encoding,我尝试了各种编码/解码组合,使用“代理程序”和“代理场景”选项,但都没有效果。我不确定这是什么格式(它甚至可能是Autoit中的一个bug),但我知道事实上信息就在那里,因为至少有一个在线utf解码器是正确的。在在线转换器网站上,我将文件指定为utf8,输出指定为utf16,输出与预期一致 我的问题是在文件读取期间。我通过在open()的选项中指定encoding='utf-8'解决了这个问题 我的问题是在文件读取期间。我通过在open()的选项中指定encoding='utf-8'解决了这个问

我尝试了各种编码/解码组合,使用“代理程序”和“代理场景”选项,但都没有效果。我不确定这是什么格式(它甚至可能是Autoit中的一个bug),但我知道事实上信息就在那里,因为至少有一个在线utf解码器是正确的。在在线转换器网站上,我将文件指定为utf8,输出指定为utf16,输出与预期一致

我的问题是在文件读取期间。我通过在open()的选项中指定encoding='utf-8'解决了这个问题


我的问题是在文件读取期间。我通过在open()的选项中指定encoding='utf-8'解决了这个问题

这个问题被称为,如果您有一个用编码的文本流,并且您用(它是的超集)对其进行解码,那么您的特定情况就会发生

因此,正如您已经看到的,您必须使用UTF-8来解码这个文件,而不是使用默认的Python编码(在您的例子中,它似乎是Windows-1252)


让我们看看为什么在您的示例中会出现这些特定的乱码字符,即:

  • É在É的地方
  • é在…的地方
  • è在的地方
下表总结了发生的情况:

所有的è、è和è都是非ASCII字符,它们用UTF-8到2字节长的代码编码

例如,赤道的UTF-8代码是:

11000011 10001001
另一方面,Windows-1252是8位编码,也就是说,它将其字符集的每个字符编码为8位,即一个字节

因此,如果现在使用Windows-1252解码位序列
11000011 10001001
,则Windows-1252将其解释为两个1字节代码,每个代码表示一个单独的字符,而不是一个2字节代码表示一个字符:

  • 第一个字节
    11000011
    C3
    十六进制)恰好是字符的Windows-1252代码(Unicode代码点U+00C3)
  • 第二个字节
    10001001
    (十六进制中的
    89
    )恰好是字符(Unicode代码点U+2030)的Windows-1252代码
您可以查找这些映射

所以,这就是为什么你的解码呈现É,而不是Ã。其他非ASCII字符的Idemé和è。

此问题被调用,如果您有一个用编码的文本流,并且您用(它是的超集)对其进行解码,则会出现您的特定情况

因此,正如您已经看到的,您必须使用UTF-8来解码这个文件,而不是使用默认的Python编码(在您的例子中,它似乎是Windows-1252)


让我们看看为什么在您的示例中会出现这些特定的乱码字符,即:

  • É在É的地方
  • é在…的地方
  • è在的地方
下表总结了发生的情况:

所有的è、è和è都是非ASCII字符,它们用UTF-8到2字节长的代码编码

例如,赤道的UTF-8代码是:

11000011 10001001
另一方面,Windows-1252是8位编码,也就是说,它将其字符集的每个字符编码为8位,即一个字节

因此,如果现在使用Windows-1252解码位序列
11000011 10001001
,则Windows-1252将其解释为两个1字节代码,每个代码表示一个单独的字符,而不是一个2字节代码表示一个字符:

  • 第一个字节
    11000011
    C3
    十六进制)恰好是字符的Windows-1252代码(Unicode代码点U+00C3)
  • 第二个字节
    10001001
    (十六进制中的
    89
    )恰好是字符(Unicode代码点U+2030)的Windows-1252代码
您可以查找这些映射

所以,这就是为什么你的解码呈现É,而不是Ã。其他非ASCII字符的Idemé和è