Python中带变音符号ü的字符串匹配异常及格式统一咨询
解决Unicode变音符号匹配异常问题
问题本质:你碰到的是Unicode字符的两种等价表示形式:
ü的合成形式(NFC):单个预组合字符U+00FC,UTF-8编码为\xc3\xbcü的分解形式(NFD):基础字符u(U+0075)加上组合变音符号¨(U+0308),UTF-8编码为u\xcc\x88
两者显示完全一样,但底层编码不同,所以count()这类匹配函数认不出是同一个内容。
直接解决办法:用Python标准库
unicodedata把两个字符串统一转成同一种归一化形式(推荐用NFC,更紧凑):
import unicodedata def normalize_unicode(s): return unicodedata.normalize('NFC', s) # 示例用法 keyword = "Münze" # 不管原先是分解还是合成形式 text = "Ich finde eine Münze im Park." # 统一归一化 norm_key = normalize_unicode(keyword) norm_text = normalize_unicode(text) # 现在匹配正常 print(norm_text.count(norm_key)) # 输出1 print(norm_key in norm_text) # 输出True
- 额外说明:
- Unicode提供四种归一化形式:NFC、NFD、NFKC、NFKD。如果只是处理变音符号这类字符等价问题,用NFC或NFD就够;NFKC/NFKD会做更彻底的转换(比如把罗马数字转成阿拉伯数字、全角转半角),按需选择。
- 只要把要比对的两个字符串都转成同一形式,所有字符串匹配操作都能正常工作。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

