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

2015-04-30 17:55:47 +08:00
 gamexg

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

所以想起来了 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 当变量名很影响可读性,如果同一个名在不同地方是不同的内容更影响可读性。

4594 次点击
所在节点    Python
9 条回复
Sylv
2015-05-01 01:00:31 +08:00
在 iPhone 上那个罕见字 gb18030:2553670965 无法显示,显示的是一个方框。看样子都不在 iOS 的字库内。
有点为你侄子未来担忧,要是以后你侄子名字在别人手机里只能显示个方框,那得多尴尬,白取这么特别的名字了。
gamexg
2015-05-01 09:25:11 +08:00
@Sylv 名字用的是  ,𪚙 只是测试用的。
Sylv
2015-05-01 09:29:44 +08:00
@gamexg 很可惜,你回复中的两个字在 iPhone 上都是方框
ryd994
2015-05-01 11:38:04 +08:00
@gamexg 然而 Nexus5 Android5.1也看不见
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
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
2015-05-01 23:27:21 +08:00
我这里显示的就是同一个字
KexyBiscuit
2015-05-02 20:19:11 +08:00
Android 上直接空白
rtyurtyu
2015-05-02 22:37:08 +08:00
"同时发现对国人来讲实际上用 UTF-8 不如用 UTF-16 更合适“

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

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

把本帖另存为UTF16有93.5K,而UTF8是49.8K

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

https://www.v2ex.com/t/187584

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

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

© 2021 V2EX