终于理解了unicode、utf-8、gb2312这些编码集之间的关系了

    这两天在写用python写vim脚本的时候遇到了要用这则匹配中文的情况。以前用c#和javascript来做的时候很简单只要用u'[/u4e00-/u9fa5]'来匹配就行了。可是在python中就不管用了,因为这些中文字符串是从vim传入的,而你要是在python代码中直接写 str = u'中文'是没有问题了,我当时百思不得其解,因为以前对字符集这东西是一知半解,当时的理解是中文占2个字节,英文等符号是一个字节。unicode就是2个字节的,utf-8,gb2312这些东西都是某种unicode。真是很傻很天真,好在看了这篇文章才让我真正理解了这个问题的本质。

    unicode这东西应该是所有程序都遵循的编码集,不论什么文字都是2字节编码所以中文肯定是2个字节,当然英文也是。而utf-8,gb2312应该算是地方语种,他们的出现可能是先于unicode或者为了和以前的代码保持兼容性,还有一个原因就是从资源节约的角度,比如utf-8对于英文及符号还是沿用ascii的一字节编码,对于中,日,韩三国文字采用三字节编码,这显然都欧美国家的网络传输有好处。而u'[/u4e00-/u9fa5]'是unicode中规定的中文字符范围,因此当用这个这则去匹配vim传入的字符串就不会起作用,因为它传入的字符串是本地编码比如utf-8或者cp936之类的。因此要想在python中正确匹配中文就要先把地方语种转换成官方语种unicode。转换方法很简单就是unicode(str,charset),然后再对这个标准的unicode字符串使用正则就可以了,而charset的获得需要借助chardet这个包。

easy_install chardet 后使用chardet.detect(str)['encoding']来获取编码集名称

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值