字符串有多种编码汉字怎么处理
曣 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为宜