通用类别是什么
Unicode 为每个码位标注一个通用类别(General Category),一级分为七类:L 字母、M 标记、N 数字、P 标点、S 符号、Z 分隔符、C 其他。二级细分为 Lu 大写字母、Ll 小写字母、Lt 首字母大写、Lm 修饰字母、Lo 其他字母(汉字属此类)、Nd 十进制数字、Mn 非间距标记、Cf 格式字符(如零宽连接符)等。正则与语言内置的字符类判定大多基于这套属性,而不是基于自己维护的字符清单。
基本信息
| 一级类别 | L 字母、M 标记、N 数字、P 标点、S 符号、Z 分隔符、C 其他 |
|---|---|
| 常用二级 | Lu 大写、Ll 小写、Lo 其他字母(汉字)、Nd 十进制数字 |
| 文本处理关键 | Mn 非间距标记(组合符号)、Cf 格式字符(零宽字符) |
| 汉字归属 | 汉字属于 Lo(其他字母),不是 Lu/Ll |
| 正则写法 | 多数引擎用 \p{L}、\p{Nd} 等属性类引用 |
| 更新方式 | 随 Unicode 版本更新,程序依赖的库版本会影响判定结果 |
典型使用场景
- 输入校验:判断是否为字母数字、是否含不可见格式字符
- 文本切分:识别组合标记,避免把基字母与重音符号拆开
- 内容风控:发现零宽字符与双向控制符这类异常格式字符
- 正则匹配:用属性类替代冗长的手写字符范围
- 排序与统计:按类别汇总文本构成,评估多语言内容质量
类别查询与匹配
类别查询与匹配
python -c "import unicodedata as u; print(u.category('中'), u.category('A'), u.category('1'))" # Lo Ll Nd
python -c "import unicodedata as u; print(u.category('\u0301'), u.category('\u200b'))" # Mn(组合重音)Cf(零宽空格)
python -c "import re; print(bool(re.match(r'^\w+$', '中A1')))" # \w 在 Python3 默认含 Unicode 字母
python -c "import re; print(re.findall(r'\p{L}+', 'abc 中 123')) if False else print('property-class-needs-regex-module')"
# 正则属性类在多数引擎里的写法:\p{L} \p{Nd} \p{M};Python 标准库不支持 \p,需用 regex 第三方模块
python -c "import unicodedata as u; print(''.join(c for c in 'a\u200bb' if u.category(c) != 'Cf'))" # 过滤格式字符一级类别速查
| 类别 | 含义 | 典型码位 |
|---|---|---|
| L 字母 | 含大小写与其他字母 | A a 中 あ |
| M 标记 | 组合与修饰标记 | U+0301 组合重音 |
| N 数字 | 十进制、字母数字、其他数字 | 0-9、罗马数字、上标数字 |
| P 标点 | 连接、破折、引号、括号等 | U+002D、U+3001 |
| S 符号 | 货币、数学、几何、emoji 等 | ¥ + ★ |
| Z 分隔符 | 空格、行、段分隔 | U+0020、U+00A0 |
| C 其他 | 控制、格式、私用、代理、未分配 | U+0009、U+200B |
不同语言与库对「字母数字」的定义并不统一:有的按 ASCII 判定,有的按 Unicode 属性判定。同一个输入在不同实现下可能一个通过一个拒绝,接口对接时要明确口径并写进文档。
格式字符(Cf)是文本清洗的重点:零宽连接符、双向控制符肉眼不可见,却会影响比较、长度与显示顺序。校验时应显式检测该类别,而不是只做去空白处理。
类别数据随 Unicode 版本变化,新版本会新增字符与调整归属。库版本不同可能导致同一字符判定不同,跨系统比对时要确认双方使用的 Unicode 数据版本。