Python中Unicode转义后右单引号解码异常问题求助
解决Python中Unicode转义解析与右单引号乱码问题
问题原因
你遇到的乱码是错误编码解码流程导致的:
sample_text本身是Unicode字符串,其中“it’s”里的’是U+2019(右单引号),它的UTF-8编码为0xE2 0x80 0x99。- 执行
sample_text.encode()时,默认使用系统UTF-8编码,将’转换为上述三个字节。 - 再调用
decode('unicode-escape')时,会把这三个字节当作Unicode转义序列的一部分解析,最终生成乱码â\x80\x99。
而print(sample_text)显示正常,是因为Python直接输出Unicode字符串时,终端会用UTF-8正确渲染’,但\u201C和\u201D是字符串里的转义序列(实际存储的是\、u、2等字符),所以直接输出了转义形式。
正确解决方案
方案1:使用ast.literal_eval解析转义序列
该方法能安全解析字符串中的Unicode转义序列,同时保留原有的Unicode字符:
import ast sample_text = "The fox's color was \u201Cbrown\u201D and it’s speed was quick" # 用repr保留转义序列,再用ast.literal_eval解析 decoded_text = ast.literal_eval(repr(sample_text)) print(decoded_text) # 输出:The fox's color was “brown” and it’s speed was quick
方案2:正则替换解析Unicode转义
手动匹配并替换\uXXXX格式的转义序列,不影响其他Unicode字符:
import re def parse_unicode_escapes(s): def replace(match): # 将十六进制字符串转为对应的Unicode字符 return chr(int(match.group(1), 16)) # 匹配所有\u开头的4位十六进制转义序列 return re.sub(r'\\u([0-9a-fA-F]{4})', replace, s) sample_text = "The fox's color was \u201Cbrown\u201D and it’s speed was quick" decoded_text = parse_unicode_escapes(sample_text) print(decoded_text) # 输出:The fox's color was “brown” and it’s speed was quick
内容的提问来源于stack exchange,提问作者impy
相关产品推荐
相关产品推荐

