这两天在写用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']来获取编码集名称