Python 2.x中错误编码的Unicode字符串转UTF-8问题求助
解决Python 2.x中Unicode字符串乱码(Ä转č)的问题
这个问题我太熟悉了——Python 2.x的字符串编解码简直是无数开发者的噩梦,尤其是遇到这种乱码转圈圈的情况😅
先拆解一下你的问题根源:你手里的u"Ä"其实是UTF-8编码的č被错误地用Latin-1(ISO-8859-1)解码成Unicode的结果。具体来说:
- 正确字符
č的UTF-8字节序列是\xc4\x8d - 当这两个字节被当作Latin-1(单字节编码,每个字节直接对应一个Unicode码点)解码时,会得到Unicode字符
U+00C4(显示为Ä)和U+008D(一个不可见的控制字符,显示为奇怪符号),也就是你看到的乱码结果。
一步一步修复的代码示例
# 你原始的错误Unicode字符串 a = u"Ä" # 1. 将错误的Unicode转回原始UTF-8字节(用Latin-1编码,因为它是单字节一一映射) utf8_bytes = a.encode('latin-1') # 此时utf8_bytes的值是 '\xc4\x8d',也就是č的正确UTF-8字节 # 2. 用UTF-8解码字节串,得到正确的Unicode字符 correct_unicode = utf8_bytes.decode('utf-8') # 现在打印就能得到正确的č了 print(correct_unicode)
为什么这个方法有效?
Latin-1编码的核心规则是:0-255范围内的每个Unicode码点,都直接对应一个字节。你得到的错误Unicode字符串里的每个字符,恰好就是原始UTF-8字节的每个字节对应的Latin-1码点。所以用encode('latin-1')可以完美还原出最初的UTF-8字节,再用UTF-8解码就得到了正确的č。
最后再提个小建议:在Python 2里一定要严格区分字节串(str类型)和Unicode字符串(unicode类型)——永远遵循「解码字节为Unicode,编码Unicode为字节」的原则:处理文本时先把输入的字节串decode成Unicode,输出时再把Unicode encode成目标编码(比如UTF-8),能避免绝大多数编解码坑。
内容的提问来源于stack exchange,提问作者leopik
相关产品推荐
相关产品推荐

