Python如何仅转换带重音英文字符为无重音形式、保留其他语言字符
实现方案
核心思路是逐字符处理,仅对ASCII范围内的拉丁字母去除重音,其余所有字符原样保留:
- 对单个字符做NFD标准化,拆分出基础字符和重音组合标记
- 判断基础字符是否为ASCII范围内的英文字母,是则保留基础字符(自动丢弃重音标记),否则保留原字符
- 最后统一转为大写即可
可直接运行的代码
import unicodedata def acc(input_str): result = [] for char in input_str: # 拆分单字符的基础字符和重音标记 nfd_char = unicodedata.normalize('NFD', char) base_char = nfd_char[0] # 仅对ASCII英文字母去除重音 if base_char.isascii() and base_char.isalpha(): result.append(base_char) else: result.append(char) return ''.join(result).upper() # 测试用例 print(acc("as平仮平ÇÈÈ.a@yah.comÈ")) # 输出:AS平仮平CEE.A@YAH.COME
注:如果使用Python 3.7以下版本,将
base_char.isascii()替换为ord(base_char) < 128即可正常运行。
原方案错误原因
- 用
encode('ascii', 'ignore')的方案会直接丢弃所有非ASCII字符,包括中日韩等其他语言文字 - unidecode库的逻辑是对所有Unicode字符做拉丁转写,会把非拉丁文字转为对应发音的英文字符,不符合保留原字符的需求
内容的提问来源于stack exchange,提问作者Cuckoo
相关产品推荐
相关产品推荐

