<p>在Python2.x中有两种类型的字符串:字节字符串和unicode字符串。第一个包含字节,最后一个包含unicode代码点。很容易确定它是什么类型的字符串-unicode字符串以<code>u</code>开头:</p>
<pre><code># byte string
>>> 'abc'
'abc'
# unicode string:
>>> u'abc абв'
u'abc \u0430\u0431\u0432'
</code></pre>
<p>“abc”字符是相同的,因为在ASCII范围内。<code>\u0430</code>是unicode代码点,它超出了ASCII范围。”“代码点”是python内部unicode点的表示,它们不能保存到文件中。需要先将它们编码为字节。这里编码的unicode字符串是什么样子的(当它被编码时,它变成了一个字节字符串):</p>
<pre><code>>>> s = u'abc абв'
>>> s.encode('utf8')
'abc \xd0\xb0\xd0\xb1\xd0\xb2'
</code></pre>
<p>此编码字符串现在可以写入文件:</p>
<pre><code>>>> s = u'abc абв'
>>> with open('text.txt', 'w+') as f:
... f.write(s.encode('utf8'))
</code></pre>
<p>现在,重要的是要记住,我们在写入文件时使用了什么编码。因为要能够读取数据,我们需要解码内容。以下是没有解码的数据:</p>
<pre><code>>>> with open('text.txt', 'r') as f:
... content = f.read()
>>> content
'abc \xd0\xb0\xd0\xb1\xd0\xb2'
</code></pre>
<p>你看,我们得到了编码字节,与s.encode('utf8')中的完全相同。要解码,需要提供编码名称:</p>
<pre><code>>>> content.decode('utf8')
u'abc \u0430\u0431\u0432'
</code></pre>
<p>解码后,我们得到了带有unicode代码点的unicode字符串。</p>
<pre><code>>>> print content.decode('utf8')
abc абв
</code></pre>