Python中如何将\xF0\x9D\x96\xA7类特殊字符串转为可匹配的普通字符串
问题原因
你遇到的是Unicode表意等价字符问题:邮件里的Hello是装饰性的Unicode数学字母符号(比如首字符是4字节编码的U+1D5A7,对应数学无衬线粗体H),视觉上和普通ASCII的H完全一致,但底层编码不同,所以字符串比对会返回False,同时MySQL默认的utf8(实际是utf8mb3,仅支持最多3字节的Unicode字符)无法存储4字节的这类字符,就会触发incorrect string value报错。
解决方案
1. 特殊字符转普通标准字符串
使用Python标准库unicodedata的NFKC归一化功能即可实现语义等价字符的转换,代码示例如下:
import unicodedata # 对邮件正文做NFKC归一化处理 normalized_email_body = unicodedata.normalize("NFKC", email_body) # 此时再做字符串比对就会返回预期结果 print(normalized_email_body[:5] == "Hello") # 输出True
NFKC(兼容分解+标准合成)是Unicode标准中专门用于将视觉/语义等价的不同编码字符统一转换为基础标准字符的规则,除了这类装饰字母外,全角字符、特殊变体符号等都可以通过该方法转为通用格式。
2. 数据库存储适配
如果需要保留原始的特殊字符格式,将MySQL对应表/字段的字符集修改为utf8mb4即可,该字符集支持全部4字节Unicode字符,不会再触发存储报错。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

