侄子的名字有罕见字,老版本的输入法打不出来,没入成户,还得去趟。
所以想起来了 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
Sylv 2015-05-01 01:00:31 +08:00 via iPhone
在 iPhone 上那个罕见字 gb18030:2553670965 无法显示,显示的是一个方框。看样子都不在 iOS 的字库内。
有点为你侄子未来担忧,要是以后你侄子名字在别人手机里只能显示个方框,那得多尴尬,白取这么特别的名字了。 |
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. |
6
gamexg OP |
7
toduse 2015-05-01 23:27:21 +08:00 via Android
我这里显示的就是同一个字
|
8
KexyBiscuit 2015-05-02 20:19:11 +08:00 via Android
Android 上直接空白
|
9
rtyurtyu 2015-05-02 22:37:08 +08:00
"同时发现对国人来讲实际上用 UTF-8 不如用 UTF-16 更合适“
你这是想当然的说,一看你就没做过测试 随便找个中文很多的网页另存为UTF8和UTF16比比大小就知道了 UTF8比UTF16小得多 道理很简单,中文多一个字节,但是英文少了一个字节,两者抵消 而一般网页上其实还是英文多 把本帖另存为UTF16有93.5K,而UTF8是49.8K |