Chouqin's Blog

A blog for hackers.

浅谈中文编码

作为一个天朝的程序员,总是会在编程的时候与中文打交道。一开始对于编码不是很熟悉,也没有弄明白它里面的原理, 在处理中文的时候总是会遇到各种各样的问题,特别是在用python处理中文的时候, 所以特地花时间研究了一下中文编码,并通过python来熟悉一些概念。

废话不多说,先上干货,中文编码杂谈, 这篇文章是淘宝搜索技术团队写的,深入浅出,基本上将中文编码的各个方面讲得十分细致,而且十分通俗易懂。 我很难讲得比这篇文章更好了,我主要从几个侧面来阐述一下我对于中文编码的理解。

中文编码是什么

中文编码其实就是将中文转化为二进制比特串的过程,而不同的编码方式会把同一个中文字符转化为不同的二进制表示, 比如“中”这个字,通过utf-8编码会转化为二进制E4B8AD,而在计算机中,所有的数据都是通过二进制保存,这样我们就可以 通过二进制E4B8AD来保存“中”字,然后我们如果需要读取保存的这个字,我们首先需要知道编码方式是utf-8,然后就能将 E4B8AD转化为“中”。

python的中文处理

python提供了对unicode很好的支持,同时也能将unicode转化为其他的各种编码。

下面通过代码来对解释一下pytho中的编码问题。

    >>>a = "我是123"
    >>>a
    '\xe6\x88\x91\xe6\x98\xaf123'
    >>>type(a)
    str
    >>>len(a)
    9

从上面的代码可以看到,python把”我是123”这个字符串当成是str类型,其实只是把这个字符串的编码 二进制当成中文来处理。当我们通过输入法输入”我是123”时,输入法会根据我们系统的LACALE值将”我是123” 编码成相应的二进制,而python遇到二进制值时的处理也是要根据系统的编码方式,如果是一个python的脚本, 我们可以通过再脚本的头部通过

`# -*- coding:utf-8 -*- `

设置python处理编码的方式。

同时可以看到”我是123”这个字符串的长度是9,这是因为字符串a在utf8编码时的二进制表示为'\xe6\x88\x91\xe6\x98\xaf\x21\x22\x23', 一共占了9个字节,python的len()函数对于字符串就是计算它占了多少个byte,所以:len(a) = 9。

下面看如何与unicode进行相互转化:(此时采用的编码是utf8,其他的编码也是一样的处理):

    >>>ua = a.decode("utf-8")
    >>>ua
    u'\u6211\u662f123'
    >>>print ua
    我是123
    >>>type(ua)
    unicode
    >>>len(ua)
    5
    >>>b = ua.encode("utf-8")
    >>>b
    '\xe6\x88\x91\xe6\x98\xaf123'

将字符串转换为unicode通过decode()函数,反过来通过encode()函数。同时也可以通过:

    ua = unicode("我是123", "utf-8")

或者是

    ua = u"我是123"

得到同样的unicode。可以看到ua的长度为5,因为在unicode中不管是汉字还是字母或者是数字, 都当作同样的字符来进行处理,这样一个unicode的长度就是所有字符的个数,而不管这些字符是中文 汉字还是英文字符。这样的好处就在于能够很好地定位到一个具体的字符,字符串的截取以及正则表达式 匹配等操作都十分方便。所以推荐在处理包含中文的字符串时,先把这个字符串转化为unicode,然后再 进行操作,操作完以后再encode成字符串。

关于中文编码就很浅显地谈到这里,希望能给大家带来帮助,有什么问题可以在留言中和我讨论。

Comments