Unicode 与 UTF-8, GBK
原本是为了回复[python-chinese]邮件列表中的一个关于socket上传输unicode的问题,写得比较长,觉得应该记下来:
我想这里有几个概念要澄清~ 这样才能有比较好的交流的基础,而不是说同一个名字,却各自指的不是同一个东西。我也只是班门弄斧,希望大家指正。
unicode是一个字符集,不是一种编码,她只是定义了一个字符空间,把字符集中的字符映射到了相应的整数上,并为每一个字符提供了唯一的名字,比如,'中' U+4E2D。但unicode并没有定义编码方式(codec),也就是从字符集到字节序列的映射方式。有专门为unicode定义的编码方式,比如utf-8,utf-16(be/le),他们定义了unicode字符到字节序列的映射,也就是编码。utf-16简单的用16bit两个字节来编码(encode)unicode,utf-8用1倒3个或者更多的字节编码(encode)一个unicode字符。这些codec同时也定义了如何从一个字节序列中decode出unicode字符序列的方式。所以,unicode是一个抽象的字符概念,并不是一个字节流,她到字节流的映射靠codec来完成。python中,用unicode对象来表示抽象的unicode字符,我觉得到这个程度就可以了,不必关心其中是不是靠整数来表示的。关键是string对象就是字节流,python的unicode对象不同于string对象,抽象的unicode对象到字节流的string对象之间需要靠codec来转换。(在py3k中可能要统一unicode和string对象,再议)
而gbk也是一个字符集,但同时他也定义了gbk这种codec(一种mbcs的codec),它定义了一个gbk字符(英文或者中文)到字节序列(一个或者两个字节)的映射。因为unicode的集合比gbk大,使gbk的超集,所以,可以把gbk编码的字节流转换成unicode字符序列,也可以把一部分的unicode字符(gbk子集的部分)编码为gbk的字节序列。所以,gbk也可以作为unicode的一种codec来用。 Read more…
Recent Comments