<p>在我看来,学习一般的unicode和<a href="http://docs.python.org/howto/unicode.html" rel="nofollow">it's use in python</a></p>
<p>如果你不想知道人们为什么要把事情搞砸,所以你必须处理一个“\xa3”,而不是一个简单的<code>£</code>,那么邓肯的回答是完美的,告诉你你想知道的一切。</p>
<h2>更新(请参阅更新2)</h2>
<p>请断言您的文件是用拉丁语-1编码保存的,并且现在是非utf-8,您的测试将通过(或者将<code>#-*- coding: latin-1 -*-</code>更改为<code>#-*- coding: utf-8 -*-</code>)</p>
<p>从我上面的链接中,你可以很容易地理解阅读(和理解)内容:</p>
<p>您的文件被保存为utf-8,这意味着对于char<code>£</code><strong>使用2个字节,但是由于您告诉python解释器编码是拉丁语-1,因此他将使用一个键的2个utf-8字节中的每个字节。</p>
<p>实际上,我可以在<code>ln2</code>中计算19个字符,但是如果您发出<code>len(ln2)</code>,它将返回21个字符。</p>
<p>当您测试<code>'£' in keyDict.keys()</code>时,您正在寻找一个2个字符的字符串,而每个2个字符在字典中都有自己的键,这就是为什么它找不到它。</p>
<p>您还可以测试<code>len(keyDict)</code>,发现它比您预期的要长。</p>
<p>我想这说明了一切,请理解不是所有的故事都很容易在一个网页上解释,但上面的链接,在我看来是一个很好的起点,混合了一些故事和一些编码示例。</p>
<p>干杯</p>
<p>备注:我正在使用这段代码,并将其保存为UTF-8,它工作得非常完美:</p>
<pre><code>#!/usr/bin/env python
#-*- coding: utf-8 -*-
ln1 = u'?0>9<8~7|65"4:3}2{1+_)'
ln2 = u"(*&^%$£@!/`'\][=-#¢"
refStr = u"%s%s" % (ln2, ln1)
keyDict = {}
for idx, chr_ in enumerate(refStr):
print chr_,
keyDict[chr_] = idx
print u"-" * 32
print u"Originl: ", refStr
print u"KeyDict: ", keyDict
tsChr = [u'£', u'%', u'\\', u'¢']
for k in tsChr:
if k in keyDict.keys():
print k, "\t", keyDict[k]
else: print k, repr(k), "\t", "not in the dic."
</code></pre>