侄子的名字有罕见字,老版本的输入法打不出来,没入成户,还得去趟。
所以想起来了 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 当变量名很影响可读性,如果同一个名在不同地方是不同的内容更影响可读性。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.