<p>当传入时,<code>json.dumps()</code>和<code>json.dump()</code>函数将尝试将<em>字节字符串解码为Unicode值,默认情况下使用UTF-8:</p>
<pre><code>>>> map = {"system1": '\x92'}
>>> json.dumps(map)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/__init__.py", line 243, in dumps
return _default_encoder.encode(obj)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 0: invalid start byte
>>> map = {"system1": u'\x92'.encode('utf8')}
>>> json.dumps(map)
'{"system1": "\\u0092"}'
</code></pre>
<p>您可以设置<code>encoding</code>关键字参数,以便对字节字符串(<code>str</code>)字符使用不同的编码。在</p>
<p>这些函数之所以这样做,是因为JSON是一个对所有字符串使用Unicode的标准。如果您向它提供编码为UTF-8的<em>而不是</em>的数据,则会失败,如上所示。在</p>
<p>在python2上,<em>输出</em>也是一个字节字符串,编码为UTF-8。它可以安全地写入文件。将<code>ensure_ascii</code>参数设置为<code>False</code>会改变这一点,而您将得到Unicode,这显然不是您想要的。在</p>
<p>因此,您需要确保将<em>放入<code>json.dumps()</code>函数的编码始终相同,<em>或</em>已经被解码为<code>unicode</code>对象。如果您不关心偶尔丢失的代码点,您可以通过将错误处理程序设置为<code>replace</code>或<code>ignore</code>来强制解码:</p>
^{pr2}$
<p>这将强制解码字符串,用替换字符替换未识别为ASCII码位的任何字节:</p>
<pre><code>>>> '\x92'.decode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 0: ordinal not in range(128)
>>> '\x92'.decode('ascii', errors='replace')
u'\ufffd'
</code></pre>
<p>这里插入一个<a href="http://codepoints.net/U+FFFD" rel="nofollow">U+FFFD REPLACEMENT CHARACTER</a>代码点来表示未知的代码点。也可以使用<code>errors='ignore'</code>完全忽略这些字节。在</p>