读书人

字符串有多种编码汉字怎么办

发布时间: 2013-09-05 16:02:07 作者: rapoo

字符串有多种编码汉字怎么处理
yàn,
部首: 日 部首笔画: 4 总笔画: 20

yàn
(1)古同“晏”,晴朗 许慎注淮南子云:“晏,无云也。”即晴朗没有云彩的天空
(2)暖

>>> s0 = ""
>>> chardet.detect(s0)
{'confidence': 0.5, 'encoding': 'windows-1252'}
>>> s="我是"
>>> chardet.detect(s)
{'confidence': 0.99, 'encoding': 'GB2312'}

>>> s.decode("gb2312")
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
s.decode("gb2312")
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 4-5: illegal multibyte sequence


有复杂汉字 请教这种情况怎么处理?
[解决办法]
“有复杂汉字 请教这种情况怎么处理? ”
只要是普通的汉字,包含你这里给出的,都是GB18030所包含的
从汉字包含数量说:
GB2312 < GBK < GB18030
所以,在可以的情况下,去用GB18030,就够你用了。

再不够用,就去用UTF-8,保证都可以。

关于编码,可参考:
中文字符编码标准

抽空,会去再写个简明教程的,到时候你看了,就更容易明白了。
[解决办法]
其实单纯就你在shell中的几句来说

gb18030 > gbk > gb2312

前包含后,所以gb2312的汉字其实很少的
chardet存在两个问题,一是字符太少判断不准,二是虽然判断出gb2312其实应该是gbk才对
你用gbk应该已经可以解决(,GBK:95EA),反而是shell几句没涉及yàn(半角)这个拼音用GBK会有问题,要改用全角才行

你可能有疑问,既然gb2312汉字很少,为何网页用gb2312就能显示很多?
那是因为字体的缘故,字体其实不论什么编码,只要对应的码能找到映射出字符,就会显示,超出编码范围也能显示
但用于程序处理则不同,超出范围就不能处理了
所以程序中一般用gbk而不用gb2312

又问:为何程序不用gb18030取代gbk,能处理的编码范围不是更大么?
因为gb18030是不定长的,双字节、三字节都有,在不熟悉的情况下,又不怎么涉及生僻字(主要指一些古体字或变形字,超出gbk范围的),一般选定长、双字节的gbk为宜

读书人网 >perl python

热点推荐