Python编码
python学习日记-day18
问题:当你在notepad++中写入一个字符如“国”发生了什么?
-
当“国”写入notepad++时,该字符便以unicode编码在内存中存储,当按下保存时会根据notepad++指定的编码(notepad++默认为UTF-8)从unicode转到UTF-8存到硬盘;
-
当打开文件时,会以存入硬盘的编码UTF-8进行解码为unicode到内存中,客户端notepad++显示时会根据notepad++的编码从unicode转到UTF-8进行显示,如果显示时notepad++编码为其他如GBK 就有可能出现乱码。
下面说说编码:
计算机最先诞生与美国,表示计算机状态的就只有高电频和低电频,人类给它描述为0和1,我们知道1字节=8比特位(1Byte = 8 bits),也就是说1字节可以由8个0或1组成,如 00000000, 每一位都可以表示0或1,也就是有两种状态,那么1位可以有2种状态,2位就可以有4种状态,3位可以有8种状态,4位有16种状态,5位有32种状态,6位有64种状态,7为有128中状态,8位有256种状态。
由于美国使用英语 只有26个字母,再加上一些特殊字符,128中状态完全足以表达对应的字母以及特殊字符,由此最初便只使用了7位做成了一个ASCII码表,美国就用这个ASCII码表来表示他们字母和特殊字符;
后来计算机传到拉丁国家,拉丁国家有一些自己的字母或特殊字符,7位128种状态不能满足需求,于是后来又扩展了ASCII码表,使用8位即256中状态来表示,主要在拉丁国家使用;
当计算机传入中国时,由于中国文字很多,之前的ASCII码表也没有中文对照关系,所以根本无法显示中文,8位也不够用,于是中国在此基础上搞了个GB2312扩展为2个字节,规定如果2个字节中如果每个字节都高于了127位就表示是汉字,如果小于127位 则还是认为是ASCII码表中的字符,但是还是不能完全表示完中文,于是又重新搞了个GBK,重新规范16位中,前7位还是ASCII码,只要超过了127之后的都表示中文,于是中国的所有字符都能够存储了。
其他国家也类似于中国一样都有了自己的编码,由此带来了问题,软件在其他地方使用会出现乱码,没法使用,于是为了统一 unicode就出现了,unicode至少是2个字节表示,也就是16个比特位,能表示65536个字符,这样全世界所有的字符都能够存储了,但是美国不高兴了,本来1个字节 7位就可以表示完他们的字符,现在变成了2个字节,会占用很多空间,于是在unicode的基础上搞出UTF-8,UTF-8是可变长编码,会自动识别英文占1个字节,其他的字符占2个字节或3个字节,这样就解决的之前的问题。
对于中文,unicode占2个字节,是明文对应二进制数字,而UTF-8占3个字符,由于UTF-8只基于unicode的一个编码,所以他是二进制数字对应unicode的二进制数字。
python编码
unicode是一种编码方式
整型是不可变类型
python2.x:
1. str:存的是bytes类型的数据
2. unicode:存的是unicode编码后的二进制数据
# *_* coding:utf-8 *_* s = "苑昊" print repr(s) # 打印是什么类型 ,打印出s存的是一个字节数据 s2 = u"李杰" # 字符串前写个u,表示存如数据为unicode数据 print repr(s2) print type(s.decode("utf-8")) # s本身是一个bytes数据,按utf-8方式解码,结果类型为unicode print type(s.decode("gbk")) #结果类型与utf-8一样,但是打印出值是不一样的 print s.decode("gbk") print type(s2.encode("utf-8")) # s2本身是一个unicode的数据,按utf-8进行编码,结果类型为 str ,因为编码后为一个字节数据,会显示为str
python2 不同类型的可以进行拼接,python3不能拼接
python3把字节类型和字符类型清晰的分开了
print((type("hello" + u"world"))) #python2,不报错 print((type(b"hello" + "world"))) # python3,报错
python3.x:
1. str: unicode
2. bytes: bytes
s = "李杰" s2 = b"hello" # 加个b,表示存为bytes print(type(s)) # s存的是unicode,类型显示为str print(type(s.encode("GBK"))) # s本身是unicode,现在按GBK解码为了bytes数据,结果类型显示为bytes print(type(s2)) # s2存的是bytes,类型为bytes print(type(s2.decode("utf-8"))) # s2本身是bytes数据,现在按utf-8编码为了unicode,结果类型显示为str
注意点:
1. unicode,utf-8,GBK都是编码规则
2. 为什么内存存储的unicode
3. 程序执行和程序执行后
更多资料参考:
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
待续...
共有 0 条评论