浅谈字符编码方式与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编码打开,怎么样,乱码了吧。
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编码打开,怎么样,乱码了吧。
相关文章推荐
- 浅谈字符编码方式与python的中文编码(二)
- 浅谈Python2获取中文文件名的编码问题
- python对于中文编码处理的几种方式
- python编码转换,列表编码转换,编码检测,pycharm编写python乱码,文件中以unicode编码方式转成中文
- ubuntu下python中文编码的设置方式
- python分词脚本 注意python对于中文的编码方式
- python 常用技巧 1.设置pip国内源 2.打开服务器上的图像界面3.创建linux命令的快捷方式4.中文编码
- python对于中文编码处理的几种方式
- 中文乱码问题 ? 原因:JSP中默认使用iso-8859-1字符编码方式,不支持中文 ? 常见的支持中文的编码方式:gb2312(常用简体汉字)、gbk(简体和繁体汉字)、utf-8 ? 解决中文乱码
- 设置python的默认编码方式为utf-8
- 编码方式与程序中文乱码原因分析
- python中包含UTF-8编码中文的列表或字典的输出
- Redis in Python:Redis 在Python2和Python3中文编码的区别
- python编码处理:unicode字节串转成中文 各种字符串举例说明
- python 编码方式总结
- python处理中文编码和判断编码示例
- Python中文编码问题(转)
- 把uri中的中文 按照url的编码方式 进行编码
- python 中文编码
- python中的中文编码问题