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
gamexg
V2EX  ›  Python

查询汉字的编码值,可用 alt+数字 打字。

  •  
  •   gamexg · 2015-04-30 17:55:47 +08:00 · 4671 次点击
    这是一个创建于 3497 天前的主题,其中的信息可能已经有所发展或是发生改变。

    侄子的名字有罕见字,老版本的输入法打不出来,没入成户,还得去趟。

    所以想起来了 alt + 数字 输入汉字,但是网上现存的查询程序查询  出错,查不出来...
    自己写了个,已经尽可能的仔细处理罕见字了,但是测试时发现 𪚙 字在gbk编码的程序下输入还是无解,Unicode的程序倒是可以输入。

    一直以为 utf-16 是定长的编码,结果碰到了 𪚙 才知道 utf-16 居然是变长的编码。“Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。” utf-32 才是定长编码。

    碰到的坑:
    大概是windows的问题,python u"𪚙" 被识别为2个汉字... linux下没有问题。无奈转换成 utf-32 然后每4byte分为1个字来解决。

    同时发现对国人来讲实际上用 UTF-8 不如用 UTF-16 更合适,大部分 UTF-8 中文编码需要占用3 byte,但是 UTF-16 一般只占用2 byte。同时都是 Unicode 编码,字符覆盖率是一样的。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # utf-8 中文编码
    
    u"""
    罕见字 𪚙
    http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=2A699&useutf8=true
    
    运行结果:
    1 gb18030:49  utf-32le:49
    2 gb18030:50  utf-32le:50
    3 gb18030:51  utf-32le:51
    A gb18030:65  utf-32le:65
    B gb18030:66  utf-32le:66
    C gb18030:67  utf-32le:67
    䶮 gb18030:65183  utf-32le:19886
    𪚙 gb18030:2553670965  utf-32le:173721
    """
    
    __author__ = 'GameXG'
    
    
    def a(b):
        c=b.encode("utf-32le")
        for d in range(len(c)/4):
            e=d*4
            f=''
            h=0
            for g in range(4):
                f+=c[e+g]
                h+=ord(c[e+g]) * 0x100 ** g
            i = f.decode("utf-32le")
    
            j = i.encode("gb18030",errors = 'ignore')
            l=0
            for k in range(len(j)):
                l += ord(j[k])*(0x100**(len(j)-1-k))
    
            print u"%s gb18030:%s  utf-32le:%s"%(i,l,h)
    

    表示用 abcdef 当变量名很影响可读性,如果同一个名在不同地方是不同的内容更影响可读性。

    第 1 条附言  ·  2015-05-01 15:40:30 +08:00
    9 条回复    2015-05-02 22:37:08 +08:00
    Sylv
        1
    Sylv  
       2015-05-01 01:00:31 +08:00 via iPhone
    在 iPhone 上那个罕见字 gb18030:2553670965 无法显示,显示的是一个方框。看样子都不在 iOS 的字库内。
    有点为你侄子未来担忧,要是以后你侄子名字在别人手机里只能显示个方框,那得多尴尬,白取这么特别的名字了。
    gamexg
        2
    gamexg  
    OP
       2015-05-01 09:25:11 +08:00
    @Sylv 名字用的是  ,𪚙 只是测试用的。
    Sylv
        3
    Sylv  
       2015-05-01 09:29:44 +08:00 via iPhone
    @gamexg 很可惜,你回复中的两个字在 iPhone 上都是方框
    ryd994
        4
    ryd994  
       2015-05-01 11:38:04 +08:00 via Android
    @gamexg 然而 Nexus5 Android5.1也看不见
    SoloCompany
        5
    SoloCompany  
       2015-05-01 15:27:41 +08:00
    关键词
    Karabiner
    Change input source to Unicode Hex Input while you are holding down right option key.
    gamexg
        6
    gamexg  
    OP
       2015-05-01 16:03:53 +08:00
    @Sylv @ryd994 真晕了,这个字占了两个编码,ctrl+f 能发现 䶮 != “” 。

    google 搜索 “” 直接没内容,baidu 把 䶮 和 “”当作一个字处理的,在百度搜索页面 ctrl+f 能发现其实是两个字,甚至百度百科 䶮 页面都是两种编码混着用的...

    必应输入法打出来的是“” gb18030:2201407289 utf-32le:59491,记得出生证明打出来的也像是“” gb18030:2201407289 utf-32le:59491。
    toduse
        7
    toduse  
       2015-05-01 23:27:21 +08:00 via Android
    我这里显示的就是同一个字
    KexyBiscuit
        8
    KexyBiscuit  
       2015-05-02 20:19:11 +08:00 via Android
    Android 上直接空白
    rtyurtyu
        9
    rtyurtyu  
       2015-05-02 22:37:08 +08:00
    "同时发现对国人来讲实际上用 UTF-8 不如用 UTF-16 更合适“

    你这是想当然的说,一看你就没做过测试

    随便找个中文很多的网页另存为UTF8和UTF16比比大小就知道了
    UTF8比UTF16小得多
    道理很简单,中文多一个字节,但是英文少了一个字节,两者抵消
    而一般网页上其实还是英文多

    把本帖另存为UTF16有93.5K,而UTF8是49.8K
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1036 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 20:37 · PVG 04:37 · LAX 12:37 · JFK 15:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.