编码

中英文字数

在之前,我们已经介绍过了 str、unicode,同样都是字符串,但是类型不一样。就 str 而言,不同变量,类型同样是 str,可能编码 也不一样,有些是 utf8,有些可能是 gbk。
一个中文字,如果是 utf8 编码,那么它的字节长度是 3,如果是 gbk 的编码,它的长度是 2。那么,我们怎么才能判断一段文字中,有多少个中文字呢?这其实也不复杂,只要先将其转为 unicode,然后 len(text) 这样,就能获取了。
英文计算的则是单词,不能用直接用 len,大抵是len(text.split(' '))。如果一段文字中,既有中文,也有英文,要如何计算最终的字数呢? (中文一字计为 1,英文一词计为 1)
除了中文之外,还有日文、韩文,都不像英文词与词之间会有空格。中日韩文的问题,一般也简写为 CJK。上面的问题,也可以翻译为: 混有 CJK 字符的,如何统计字数?

至于答案,说简单也简单,说难也难。
首先,我们将需要计数的文本,转为 unicode 编码,在 unicode 编码表中,CJK 字符是堆在一块的,所以,可以比较容易找到它们。
然后,我们使用 正则表达式 去匹配 (潜在的)CJK 文字英语单词,计算总的匹配数,那么就获得最终的字数了(虽然还不够 100% 精准)。
参考代码如下:

len(re.findall(u'[\u1100-\ufde8]|[a-z0-9\-_/]+', content, flags=re.I))

什么是编码

如上,以 『中英文字数』的统计,为一个引子。我们总是能见到 编码 这个词,至于编码具体是什么?虽然普通情况下是指 utf8、gb2312、gbk、unicode 之类的,但这个词语实际被使用时,指向蛮广泛的。

基于数据结构的,有 JSON、XML 这类的编码,还有 Python 中可以使用 pickle,尽可能保留原始 Python 内的数据对象结构。这些编码都代表了数据的格式
如果要进行加密、解密的,可以尝试使用 AES 或者 DES 的算法,这些编码,本质上就是算法
还有为了让文本有尽可能安全 (这个安全并非 security,而是偏向 safely,可以理解为高兼容性) 地流通,有 base64 这种编码,它的兼容性很高,不会出现乱码。
而 utf8、gbk、gb2312 则是代表了背后的字符集,本质上是 (人类)文字 的呈现。而 unicode 则是更广泛意义上的字符集的合集,除了英文、中文 之外,还有其它语言的字符。

以 unicode 为例,unicode(text, 'utf8') 或者 unicode(text, 'gb2312') 此类将原有编码格式的转为 Python 内的 unicode 格式,而一个 unicode 字符串,可以 text.encode('utf8') 或者 text.encode('gb2312') 此类重新转为指定的编码格式。
这一来一回的过程,也就是 decode (解码)encode (压码) 的过程。

简而言之,编码是一种格式,至于为什么使用某种格式,都是当下场景决定的。
甚至于,你自己可以创建出某种编码,它不过是数据流通时的一种规则而已。