关于字符编码

参考博客:http://www.cnblogs.com/284628487a/p/5584714.html

首先,你需要知道的就是ASCII、unicode、utf-8、gbk等都属于编码格式,他们都是将文字转化为bytes类型,

bytes的取值范围为0-255,你也可能看到b'\xe6\xb5\x8‘这种格式,其实也属于bytes类型,对应的数字分别是230\181\139,

之后,你再将byte类型转化为二进制,也就是后面这样0b11100110\0b10110101\0b10001011的形式,这样就属于机器码了。

 

在unicode之前,用的都是ASCII。ASCII码非常简单,每个英文字符都以7位二进制的方式存储在计算机内,其范围是32~126。

ASCII编码的文件小巧易读。一个程序只需要简单的把文件的每个字读出来,把对应的数值转换成字符显示出来就可以了。

但是ASCII字符只能表示95个可打印字符,后来软件厂商把ASCII扩展到了8位,这样ASCII就可以表示223字符了。但是这对非英语文字的地区来说肯定是不够的。

为了解决全球化的文字性问题,就创建了万国码,即unicode。

unicode通过是用一个或多个字节来表示一个字符的方法突破了ACSII的限制。

unicode在很长一段时间内无法推广,直到互联网的出现。为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

ASCII:一个英文占1个字节,没有中文。

unicode(定长2):在python2中一个中文占两个字节,一个英文占两个字节。

    (定长4)在python3中,一个中文占四个字符,一个英文也占四个字节。

GBK(定长2):使用两个字节编码,一个中文占两个字节,一个英文也占两个字节。

utf-8:变长,一个中文占三个字节,一个引文占一个字节,字符长都可以在1-4之间流动。

utf-16:也是一种边长编码,但是并不能向后兼容ASCII,使用较少。

 

不同的编码之间不能相互识别,会产生乱码

unicode由于太占内存,因此默认存储和传输都是用的utf-8、gbk等方式,但绝对不是unicode

再python3中,汉字默认使用utf-8,英文和数组默认使用ASCII的编码方式。

print(chardet.detect('abc123'.encode()))
#{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
print(chardet.detect('测试'.encode()))
#{'encoding': 'utf-8', 'confidence': 0.7525, 'language': ''}

因此unicode模式的文件必须转换

 

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8或gbk编码。

用记事本编辑的时候,从文件读取的UTF-8或着gbk字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8或gbk保存到文件:

 

不同编码之间的转化

gkb——》unicode《——utf8,因为unicode是万国码,因此gbk和unf-8能够与Unicode直接转化

但是gbk和utf-8之间就不能直接转了,必须要有过度   gkb——》unicode——》utf-8

 

下面这个函数可以查询python默认的编码方式

python2
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

python3
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

 在python2中,如果你在编写代码的时候在文件开头没有指定编码格式,类似下面这样:

#coding:utf-8

那么程序就会直接报错:

SyntaxError: Non-ASCII character '\xe6' in file F:/py_test_dir/test_code/venv/test_code/encode_test.py on line 6, but no encoding declared; 

总之在python2中,编码是一个大问题。

 

decode解码是将其解码称为unicode,

因此在window和linux下面,decode的方式不一样,一个是使用GB2312,另一个是utf-8.

而encode必须是基于unicode的对象,因此在python2下面,编码之前先要解码,但是在python3中就统一成了unicode,不论你在那个平台。

posted @ 2017-10-20 23:24  明王不动心  阅读(602)  评论(0编辑  收藏  举报