擅长:python、mysql、java
<p>您正在编码到UTF-8,然后<em>re</em>-编码到UTF-8。Python只有先将<em>解码为Unicode时才能执行此操作,但它必须使用默认的ASCII编解码器:</p>
<pre><code>>>> u'ñ'
u'\xf1'
>>> u'ñ'.encode('utf8')
'\xc3\xb1'
>>> u'ñ'.encode('utf8').encode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
</code></pre>
<p>不要继续编码;将编码留给UTF-8<em>直到最后一个可能的时刻</em>。改为连接Unicode值。</p>
<p>您可以在这里使用<code>str.join()</code>(或者,更确切地说,使用<code>unicode.join()</code>)将这三个值与中间的破折号连接起来:</p>
<pre><code>nombre = u'-'.join(fabrica, sector, unidad)
return nombre.encode('utf-8')
</code></pre>
<p>但即使在这里编码也可能为时过早。</p>
<p>经验法则:解码接收到值的时刻(如果不是API已经提供的Unicode值),仅在必须时编码(如果目标API不直接处理Unicode值)。</p>