unicodedata.normalize()对全半角无效,因其处理Unicode等价性而非全半角映射;全角数字0(U+FF10)与半角0(U+0030)码位不同、无标准化关系;NFKC转换全角ASCII字符效果不稳定,需用east_asian_width或ord范围显式判断并映射。

全角半角混杂的文本会破坏字符串匹配、分词、正则提取和模型输入一致性——unicodedata 是 Python 标准库中唯一无需额外依赖就能做底层 Unicode 归一化处理的模块,但直接调用 normalize() 并不能解决全半角问题,必须配合字符映射或条件转换。
为什么 unicodedata.normalize() 对全半角无效
unicodedata.normalize() 处理的是 Unicode 等价性(如 NFC/NFD 中的组合字符),而全角数字 0(U+FF10)和半角 0(U+0030)在 Unicode 中属于不同码位、无标准化关系。试图用 normalize('NFKC', s) 虽然能转换部分全角标点(如全角逗号 → 半角),但对全角 ASCII 字符(字母、数字)效果不稳定,尤其在 CPython 3.9+ 后部分全角拉丁字符不再被 NFKC 自动转为半角。
实际清洗必须显式判断字符类别并映射:
- 用
unicodedata.east_asian_width(c)判断是否为全宽字符(返回'F'或'W') - 用
ord(c)范围判断是否属于全角 ASCII 区(0xFF01–0xFF5E对应 !–~,0xFF10–0xFF19对应 0–9) - 避免依赖
str.translate()预制表——不同项目对“是否转换全角字母”需求不同(如人名保留全角 A 更稳妥)
如何安全地只转换全角数字和常用标点
多数 NLP 场景只需统一数字和基础符号,保留全角汉字与英文字母(避免把「ABC」错误转成「ABC」导致 OCR 校验失败)。推荐按需构造映射字典,而非全局替换:
0xFEE0
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











