V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
guoguobaba
V2EX  ›  Python

问个汉字处理的问题

  •  
  •   guoguobaba · 11 小时 6 分钟前 · 1539 次点击

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

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

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

    第 1 条附言  ·  5 小时 29 分钟前
    感谢 @zhmouV2 http://www.unicode.org/Public/security/revision-03/confusablesSummary.txt 用这个创建一个 map 就可以了。 从 CJK UNIFIED IDEOGRAPH 作为标准就可以了。

    刚发现一个例外,
    ```
    # 戶 戸 ⼾
    (‎ ⼾ ‎) 2F3E KANGXI RADICAL DOOR
    ← (‎ 戶 ‎) 6236 CJK UNIFIED IDEOGRAPH-6236
    ← (‎ 戸 ‎) 6238 CJK UNIFIED IDEOGRAPH-6238
    ```
    他们的标准字体应该是户,6237
    16 条回复    2025-12-04 17:27:26 +08:00
    guoguobaba
        1
    guoguobaba  
    OP
       11 小时 5 分钟前
    ```
    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
        2
    yuuluu  
       10 小时 44 分钟前
    unicode 姿势 +1

    目前知道的:
    1. 字素组合字
    2. 空白字符识别
    zhmouV2
        3
    zhmouV2  
       10 小时 43 分钟前   ❤️ 2
    这个估计是没办法 只能查
    https://util.unicode.org/UnicodeJsps/confusables.jsp

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

    Unicode CJK 区的重复字符倒挺多的
    newaccount
        4
    newaccount  
       10 小时 32 分钟前
    OCR 之后再跟原文比对?
    guoguobaba
        5
    guoguobaba  
    OP
       10 小时 14 分钟前
    kanakana
        6
    kanakana  
       10 小时 13 分钟前
    还挺神奇的,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
        7
    yuzii  
       10 小时 10 分钟前
    一个中文、一个日文
    kanakana
        8
    kanakana  
       10 小时 10 分钟前
    @kanakana 等下弄错了,楼主的是 CJK RADICAL EAT ONE ,这个的确没有 compat normalization ,必须要 confusables 了……
    zoyopo
        9
    zoyopo  
       10 小时 3 分钟前
    试了下 edge 的 ctrl+f 搜索 已经做过这个转换了 搜索‘食’可以搜索到其它两个变种
    ratazzi
        10
    ratazzi  
       9 小时 59 分钟前
    realpg
        11
    realpg  
    PRO
       9 小时 2 分钟前
    @zoyopo #9
    edge 这个是上游的 chromium 就做了吧
    54xavier
        12
    54xavier  
       7 小时 20 分钟前
    我这边遇到过一次异体字问题,功能是客户自行上传文件,文件名含有一些固定格式的重要信息,需要使用正则匹配解析内容,结果出现了异体字定位了很久才发现差异,怀疑客户是五笔输入并且没有选对字。解决办法是加了个 replaceAll 给全部替换掉,暂时只能这么解决了。
    '内'、'內'

    kukuCode
        13
    kukuCode  
       7 小时 17 分钟前
    我们做过一个 cad shx 格式字体转为 ttf 的项目。甲方自定义的特殊字符,可以通过映射的方式转到 ttf 中,或者你直接 svg 显示
    tf2
        14
    tf2  
       7 小时 16 分钟前
    这个 case 来看 cjk 统一是对的。。
    54xavier
        15
    54xavier  
       7 小时 14 分钟前
    @zoyopo 有意思的是 ‘內’ (入)却无法通过搜索找到异体字,我还特地又去查了一次百度百科,确认这个字就是内(人)的异体字
    Leon406
        16
    Leon406  
       3 小时 53 分钟前
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2995 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 13:21 · PVG 21:21 · LAX 05:21 · JFK 08:21
    ♥ Do have faith in what you're doing.