您的位置:首页 > 编程语言 > Python开发

浅谈字符编码方式与python的中文编码(一)

2013-04-06 18:39 295 查看
浅谈字符编码方式与python的中文编码(一)

1、ANSI

最初,计算机中只存储西方人常用的一些字符,比如英文字母、常见符号、数字等,加起来也不超过128个。也就是说,一个字符占用一个字节的长度,这就是所谓的ANSI编码规范。ASCLL就是最初的ANSI规范中最普遍使用的字符集,相当于把每个字符都映射了一个单独的编码,东拼西凑正好128个!!也就是从0编到了127。

后来,又出现问题了,像一些特殊的图形符号、罗马文等没法表示,于是又扩展到了255号,添加的部分又称之为扩展字符集。

但是,西方国家万万没有想到远东的亚洲国家怎么办?计算机引进中国后,又添加了60000多个常见的中文字符,也就是两个字节存储一个汉字字符。这种汉字方案成为"GB2312",GB2312是对ASCLL的一种扩展。后来又加入一些不常见汉字,就成为了GBK码。其他国家也一样,都弄出了包含自己国家的编码方案。但是不同国家的编码方案不一样,同一个编码可能对应了不同的字符。所以经常会出现乱码的现象。所以有一种叫做DBCS(double-byte
character set双字节字符集)的说法,是这些编码方案的统称(DBCS本身不是一种编码方案)。其中CP932表示日文,CP936表示中文,CP949表示韩文,等等。通常我们都视GBK即为CP936,但是两者有一些细微的差别。微软默认的汉语编码是CP936,而GBK是中国官方的标准。实际上,GBK比CP936多了几十来个汉字,具体的差别可以查询维基百科。

后来中国又将GBK升级成了GBK18030,又多了几百个不常用的汉字吧。

另外这些汉字的编码方式都是向下兼容的。
那么BIG5又是什么呢?即常说的大五码。这个是繁体中文(整体中文)最普遍使用的编码方式。这个就不细说了。

2、UNICODE
前面那么多的编码够烦人的了。终于,UNICODE横空出世了!!
Unicode(统一码、万国码),成为了计算机科学领域一项新的业界标准。即每个字符占用两个字节,这样省了很多事。目前实际应用的统一码版本对应于UCS-2(还有UCS-4什么的,这里不讨论),使用16的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216(即65536)个字符。基本满足各种语言的使用。实际上当前版本的统一码并未完全使用这16位编码,而是保留了大量空间以作为特殊使用或将来扩展。但是,对于原来的ASCLL码对应的字符,在UNICODE上实际只用了低8位,而高8位都为0,这就浪费了一部分空间。

3、最令人纠结的编码转换
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的存储方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode
Transformation Format,简称为UTF)

UTF-8编码(使用一至四个字节为每个字符编码存储)。这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大大节省了编码长度。除此之外,还有UTF-16。

刚才说UNICODE是2个字节表示一个字符,这里怎么UTF-8又出现了三到四个字节?

因为UNICODE仅仅是一个符号映射表,或称符号集,但是他并没有明确定义如何将一个字符存储在计算机中,UTF-8是UNICODE的实现方式之一!!!它只是定义了不同字符的序号,而这里是指字符的存储时的编码!!

例如:汉字“严”的UNICODE码是4E25,而它的UTF-8编码是E4B8A5。
总的一句话:UCS(Unicode
Character Set)还仅仅是字符对应码位的一张表而已,比如"汉"这个字的码位是6C49。字符具体如何传输和储存则是由UTF(UCS Transformation
Format)来负责。

4、干脆再啰嗦一点
windows的记事本默认用UTF-8编码和解码。
做个小试验。
打开记事本,打上“汉字”,另存为--编码选择ANSI,再选择--文件---打开---找到那个保存好的文件,选择Utf-8编码打开,怎么样,乱码了吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: