问个汉字处理的问题

2025 年 12 月 4 日
 guoguobaba

有个文件,包含'⻝' 11997 和食是相同的字,但是是不同的编码,

⻝ (U+2EDD)和 食 (U+98DF)的关系是:它们是同一个字的不同视觉表现形式,但 Unicode 指定 U+98DF 为标准形式,U+2EDD 为其异体形式(特别是作为部首时)。

问了一下 AI ,都是让枚举做一个 map ,有没有统一的转化这样汉字的方案,unicodedata.normalize 不行。

4027 次点击
所在节点    Python
18 条回复
guoguobaba
2025 年 12 月 4 日
```
import unicodedata
import sys

s = '⻝'
print(f"Python 版本: {sys.version}")
print(f"Unicode 版本: {unicodedata.unidata_version}")
print(f"字符: '{s}'")
print(f"Unicode: U+{ord(s):04X}")
print(f"字符名称: {unicodedata.name(s, '未知')}")

# 尝试不同的归一化形式
forms = ['NFC', 'NFD', 'NFKC', 'NFKD']
for form in forms:
result = unicodedata.normalize(form, s)
print(f"{form}: '{result}' (U+{ord(result):04X}) - 是否变化: {s != result}")
```
yuuluu
2025 年 12 月 4 日
unicode 姿势 +1

目前知道的:
1. 字素组合字
2. 空白字符识别
zhmouV2
2025 年 12 月 4 日
这个估计是没办法 只能查
https://util.unicode.org/UnicodeJsps/confusables.jsp

规范化分解应该是针对西文的,中文不行。

Unicode CJK 区的重复字符倒挺多的
newaccount
2025 年 12 月 4 日
OCR 之后再跟原文比对?
guoguobaba
2025 年 12 月 4 日
kanakana
2025 年 12 月 4 日
还挺神奇的,U+2EDD (⻝)和 U+2F29 (⼩)都是康熙部首字符:

2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;

2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;

UnicodeData.txt 里面也都相应标出了 <compat> 的分解形式:一个是 U+5C0F (汉字的“小”),一个是 U+98DF (汉字的“食”),但是它们 NFKC normalize 的结果却不同:

>>> f'U+{ord(unicodedata.normalize('NFKC', chr(0x2F29))):04X}'

'U+5C0F' (中文“小”)

>>> f'U+{ord(unicodedata.normalize('NFKC', chr(0x2FB7))):04X}'

'U+2FB7' (仍然是康熙部首“⻝”)

感觉会不会是 Unicode 的问题……但无论如何,要想手动 normalize 的话应该把 UnicodeData.txt 里面的第六列提出来也可以。但例如 Firefox 用的似乎是 confusables.txt [1],比 UnicodeData 来说提供了更多基于字形的 normalization ,也可以考虑一下。

[1] https://github.com/unicode-org/icu/blob/main/icu4c/source/data/unidata/confusables.txt
yuzii
2025 年 12 月 4 日
一个中文、一个日文
kanakana
2025 年 12 月 4 日
@kanakana 等下弄错了,楼主的是 CJK RADICAL EAT ONE ,这个的确没有 compat normalization ,必须要 confusables 了……
zoyopo
2025 年 12 月 4 日
试了下 edge 的 ctrl+f 搜索 已经做过这个转换了 搜索‘食’可以搜索到其它两个变种
ratazzi
2025 年 12 月 4 日
realpg
2025 年 12 月 4 日
@zoyopo #9
edge 这个是上游的 chromium 就做了吧
54xavier
2025 年 12 月 4 日
我这边遇到过一次异体字问题,功能是客户自行上传文件,文件名含有一些固定格式的重要信息,需要使用正则匹配解析内容,结果出现了异体字定位了很久才发现差异,怀疑客户是五笔输入并且没有选对字。解决办法是加了个 replaceAll 给全部替换掉,暂时只能这么解决了。
'内'、'內'

kukuCode
2025 年 12 月 4 日
我们做过一个 cad shx 格式字体转为 ttf 的项目。甲方自定义的特殊字符,可以通过映射的方式转到 ttf 中,或者你直接 svg 显示
tf2
2025 年 12 月 4 日
这个 case 来看 cjk 统一是对的。。
54xavier
2025 年 12 月 4 日
@zoyopo 有意思的是 ‘內’ (入)却无法通过搜索找到异体字,我还特地又去查了一次百度百科,确认这个字就是内(人)的异体字
Leon406
2025 年 12 月 4 日
Twelveeee
2025 年 12 月 5 日
之前遇到过一样的问题,一个字是银行(2F8F),另外一个字是银行(884C),怎么匹都匹不上。

对,就是这个 https://www.unicode.org/Public/security/revision-03/confusablesSummary.txt
powersee
2025 年 12 月 5 日
同一个字可能有多种形式。因为 CJk 比较特殊,可能同一个字有 3-4 种形式存在,例如:中文简体、中文繁体、日文、韩文

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/1176823

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX