我想向学生展示打开macroman / latin1文件的结果,该文件编码为latin1 / macroman [resp。]:
>>> s = u"Tout condamné à mort aura la tête tranchée."
>>> print s.encode("latin1").decode("macroman")
Tout condamnÈ ‡ mort aura la tÍte tranchÈe.
>>> print s.encode("macroman").decode("latin1")
Tout condamn mort aura la tte tranche.
但是我很困惑的是第二次转换没有显示任何可见的非ASCII字符。不是macroman和latin1都不是字节< - >角色双射?
注意:这与Python无关,因为我可以使用文本编辑器重现行为。
答案 0 :(得分:2)
“Latin1”是一个含糊的术语,可以参考ISO Latin 1(ISO 8859-1)或Windows Latin 1(windows-1252)。不同之处在于,在ISO Latin 1中,字节0x80到0x9F被指定为控制字符(很少使用),而在Windows Latin 1中,大多数被定义为图形字符(标点符号和一些非Ascii拉丁字母)和一些左未定义。
当您采取例如字母“é”和Latin1编码(在Latin1编码中),你得到字节0xE9。如果您将此字节解释为MacRoman编码,就像您似乎正在做的那样,您将获得“È”字符。这就是为什么你得到“condamnÈ”。
但是如果你把字母“é”作为MacRoman编码,它就是0x8E。将此字节解释为Latin1数据时,Latin1编码会有所不同。在ISO Latin 1中,它是控制字符SINGLE SHIFT TWO(U + 008E);在Windows Latin 1中,它是“Ž”LATIN CAPITAL LETTER Z WITH CARON(U + 017D)。显然,您的代码将Latin1视为ISO Latin 1.由于U + 008E在大多数程序中通常没有赋值给它,因此在渲染时通常会忽略它,但在这种情况下,它会显示为空格。
其他情况类似:MacRoman“à”为0x88,MacRoman“ê”为0x90,属于控制字符均为ISO 8859-1。