我假设样本值应该是:print u'BiquÃni'.encode('latin_1').decode('utf-8') # Biquíni
因此,在你的代码中:
^{pr2}$
问题是,当您实现链时:将unicode编码为“utf-8”字节。
使用任何1字节编码(如“拉丁语1”)对这些字节进行解码。
对于输入端的每一个非ASCII-unicode字符,输出端总是接收到错误的字符。发生这种情况是因为对于这样一个字符,在'utf-8'中至少有2个字节的值。
让我们看看示例:print ord(u'z') # 122 => ASCII
print repr(u'z'.encode('utf-8')) # 'z', 1 byte
print repr('z'.decode('latin_1')) # u'z'
如我们所见,对于ASCII字符,一切正常,但是:print ord(u'í') # 237 => non-ASCII
import unicodedata
print repr(u'í') # u'\xed'
print unicodedata.name(u'\xed') # LATIN SMALL LETTER I WITH ACUTE
print repr(u'\xed'.encode('utf-8')) # '\xc3\xad' => 2 bytes
print repr('\xc3'.decode('latin_1')) # u'\xc3' - the 1st char
print repr('\xad'.decode('latin_1')) # u'\xad' - the 2nd char
print unicodedata.name(u'\xc3') # LATIN CAPITAL LETTER A WITH TILDE
print unicodedata.name(u'\xad') # SOFT HYPHEN
因此,在编码'utf-8'后的每个非ASCII字符的代码中,会得到2个字节,然后用'latin_1'解码为2个字符,它们与初始字符不对应。
因此,您当前的计划将产生不理想的结果。
我建议在代码中对encode()和decode()步骤使用相同的编码。在
本文探讨了在处理Unicode字符时,为何使用'utf-8'编码和随后用'latin_1'解码会导致错误。通过实例揭示了非ASCII字符编码成2字节的过程,并建议在编码和解码阶段统一使用UTF-8标准以避免不理想结果。
1554

被折叠的 条评论
为什么被折叠?



