<p><strong>简短回答</strong></p>
<p>使用cp437作为一些复古DOS乐趣的编码。所有大于或等于32十进制的字节值(127除外)都映射到此编码中的可显示字符。然后使用cp037作为一个真正的trippy时间的编码。然后扪心自问,如果其中任何一个是“正确的”,你怎么知道它们中的哪一个是“正确的”。</p>
<p><strong>长答案</strong></p>
<p>你必须忘记一些东西:字节值和字符的绝对等价性。</p>
<p>如今,许多基本的文本编辑器和调试工具,以及Python语言规范,都意味着字节和字符之间的绝对等价性,而实际上根本不存在这种等价性。<code>74 6f 6b 65 6e</code><strong>不是“令牌”。只有对于与ASCII兼容的字符编码,此<em>对应</em>才有效。在EBCDIC中,“token”对应于字节值<code>a3 96 92 85 95</code>。</p>
<p>因此,尽管Python 2.6解释器很高兴地将<code>'text' == u'text'</code>计算为<code>True</code>,但它不应该这样做,因为在ASCII或兼容编码的假设下,它们只是等价的,即使这样,也不应该认为它们是等价的。(至少<code>'\xfd' == u'\xfd'</code>是<code>False</code>,并为您提供尝试警告。)Python 3.1将<code>'text' == b'text'</code>计算为<code>False</code>。但是,即使解释器接受这个表达式,也意味着字节值和字符的绝对等价性,因为表达式<code>b'text'</code>被认为是“解释器将ASCII编码应用于<code>'text'</code>时获得的字节字符串”。</p>
<p>据我所知,目前广泛使用的每一种编程语言在其设计中都隐含着ASCII或ISO-8859-1(拉丁语-1)字符编码。在C中,<code>char</code>数据类型实际上是一个字节。我看到一个Java 1.4vm,其中构造函数<code>java.lang.String(byte[] data)</code>采用ISO-8859-1编码。大多数编译器和解释器假定源代码是ASCII或ISO-8859-1编码(有些允许您更改)。在Java中,字符串长度实际上是UTF-16代码单位长度,这对于字符<code>U+10000</code>和更高的字符可能是错误的。在Unix中,文件名是根据终端设置解释的字节字符串,允许您<code>open('a\x08b', 'w').write('Say my name!')</code>。</p>
<p>因此,我们都接受过训练,并被我们学会信任的工具所制约,相信“A”<strong>是</strong>0x41。但它不是。“A”是一个字符,0x41是一个字节,它们根本不相等。</p>
<p>一旦你在这一点上开悟了,你就不难解决你的问题。您只需确定软件中的哪个组件正在为这些字节值假定ASCII编码,以及如何更改该行为或确保出现不同的字节值。</p>
<p>注:“扩展ASCII”和“ANSI字符集”这两个词用词不当。</p>