首页 » 编程 » Python基础 » 正文

Python编码

python学习日记-day18


问题:当你在notepad++中写入一个字符如“国”发生了什么?

  1. 当“国”写入notepad++时,该字符便以unicode编码在内存中存储,当按下保存时会根据notepad++指定的编码(notepad++默认为UTF-8)从unicode转到UTF-8存到硬盘;

  2. 当打开文件时,会以存入硬盘的编码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




待续...

发表评论

验证码加载中....