<p><em>这个答案是关于Python 2的。在Python 3中,<code>str</code>是一个Unicode字符串。</em></p>
<p>Python的<code>str</code>类型是8位字符的集合。英文字母表可以用这8位字符表示,但符号如‘,♠,Ω和ℑ不能。</p>
<p><strong>Unicode</strong>是处理各种字符的标准。每个符号都有一个码位(一个数字),这些码位可以使用各种编码方式进行编码(转换为字节序列)。</p>
<p><strong>UTF-8</strong>就是这样一种编码。低码位使用单字节编码,高码位使用字节序列编码。</p>
<p>Python的<code>unicode</code>类型是代码点的集合。行<code>ustring = u'A unicode \u018e string \xf1'</code>创建一个包含20个字符的Unicode字符串。</p>
<p>当Python解释器显示<code>ustring</code>的值时,它将转义其中两个字符(Ǝ和ñ),因为它们不在标准的可打印范围内。</p>
<p>行<code>s = unistring.encode('utf-8')</code>使用UTF-8对Unicode字符串进行编码。这会将每个码位转换为适当的字节或字节序列。结果是一个字节集合,返回为<code>str</code>。<code>s</code>的大小是22个字节,因为其中两个字符有很高的码位,并且被编码为两个字节的序列,而不是一个字节。</p>
<p>当Python解释器显示值<code>s</code>时,它将转义不在可打印范围内的四个字节(<code>\xc6</code>、<code>\x8e</code>、<code>\xc3</code>和<code>\xb1</code>)。这两对字节不像以前那样被视为单个字符,因为<code>s</code>是<code>str</code>类型,而不是<code>unicode</code>。</p>
<p>行<code>t = unicode(s, 'utf-8')</code>与<code>encode()</code>相反。它通过查看<code>s</code>的字节并解析字节序列来重建原始代码点。结果是一个Unicode字符串。</p>
<p>对<code>codecs.open()</code>的调用指定<code>utf-8</code>作为编码,它告诉Python将文件(字节集合)的内容解释为使用UTF-8编码的Unicode字符串。</p>