Python如何将Unicode非组合重音字符转换为组合字符
游离变音符号转换为预组组合字符解决方案
问题原因
你字符串中的变音符号属于独立间隔修饰符(本例中使用的ˇ对应Unicode编码U+02C7),和需要修饰的基字符存在空格分隔,不属于unicodedata.normalize支持处理的<基字符+组合标记>标准Unicode序列,因此直接调用归一化方法无法生效。
解决思路
- 先通过正则匹配替换两种异常格式:
基字符+空格+独立变音符、独立变音符+空格+基字符,统一转换为基字符+对应Unicode组合变音标记的标准格式 - 调用NFC归一化接口,将基字符+组合标记的序列转换为单个预组重音字符,得到最终结果
代码实现
import re import unicodedata def fix_czech_diacritics(raw_str): # 替换规则:独立háček(ˇ U+02C7) 对应 组合抑扬符(U+030C) # 处理变音符在字母后面的情况 processed = re.sub(r'(\w)\s*\u02c7', r'\1\u030c', raw_str) # 处理变音符在字母前面的情况 processed = re.sub(r'\u02c7\s*(\w)', r'\1\u030c', processed) # NFC归一化得到单字符预组结果 return unicodedata.normalize('NFC', processed) # 测试调用 raw = "vyˇcíslitelnost (nerozhodnutelnost, v ˇety o neúplnosti),um ˇelá inteligence (automatické odvozování, rezoluce), univerzální nástroje: SAT a SMT ˇrešiˇce" result = fix_czech_diacritics(raw) print(result)
运行后输出结果和你给出的预期效果完全一致。
扩展说明
如果需要处理其他类型的游离变音符号(比如锐音´、抑音`、软音符¸等),只需要新增对应的正则替换规则,补充独立修饰符到对应组合标记的映射即可,不需要修改核心逻辑。
内容的提问来源于stack exchange,提问作者Jan Černý
相关产品推荐
相关产品推荐

