day1-单位转换、byte、字符编码与转码

一、单位转换

计算机中能表示的最小单位,是一个二进制位(bit)
计算机中能存储的最小单位,是一个二进制位(bit)

8bit = 1byte(字节)
1024byte = 1kbyte
1024kbyte = 1mbyte
1024mb = 1gb
1024gb = 1T

二、字符编码

1. ASCII:美国标准信息交换代码,其最多只能用 8 位来表示,即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号(一个字符占1个字节8个比特位)

2. ASCII与中文

ASCII         
gb2312    7445    嵌入式设备
gbk     2w+      pc
gb18030    27xxx

从ASCII、GB2312、GBK 到GB18030,这些编码方法是向下兼容的

3. Unicode:统一码、万国码、单一码,是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定所有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,可能有更多字节。

4. UTF-8:对Unicode编码的压缩和优化,是Unicode的扩展集,它不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

所以,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:

报错:ascii码无法表示中文

1 #!/usr/bin/env python
2 print "你好,世界"

 改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:

1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 print "你好,世界"

 三、pyc

pyc 预编译后的字节码文件,完成度低,与Python文件的时间作比较进行更新

四、bytes

bytes类型-->二进制数据类型

1. python2 认为bytes类型与字符串类型一样,python3 文本总是unicode,由str类型表示

2. 字符串可以编码成字节包,而字节包可以解码成字符串,python3 数据传输必须转换成二进制(socket)

转换:
字符串-encode-字节
字节-decode-字符串

五、字符编码与转码

此图仅适用于python2

utf-8 转成 gbk
s.decode("utf-8").encode("gbk")
解释:将s转换成unicode,此时需声明它之前是utf-8,然后转成gbk,需声明它现在要转换的编码    

需知:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

 1 #-*-coding:utf-8-*-
 2 #Python2
 3 
 4 import sys
 5 print(sys.getdefaultencoding())
 6 
 7 msg = "我爱北京天安门"
 8 msg_gb2312 = msg.decode("utf-8").encode("gb2312")
 9 gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")
10 
11 print(msg)
12 print(msg_gb2312)
13 print(gb2312_to_gbk)
14 
15 ascii
16 我爱北京天安门
17 我爱北京天安门
18 我爱北京天安门
 1 #-*-coding:gb2312 -*-
 2 #python3
 3 
 4 import sys
 5 print(sys.getdefaultencoding())
 6 
 7 msg = "我爱北京天安门"
 8 #msg_gb2312 = msg.decode("utf-8").encode("gb2312")
 9 #默认就是unicode,不用再decode,喜大普奔
10 msg_gb2312 = msg.encode("gb2312") 
11 gb2312_to_unicode = msg_gb2312.decode("gb2312")
12 gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
13 
14 print(msg)
15 print(msg_gb2312)
16 print(gb2312_to_unicode)
17 print(gb2312_to_utf8)
18 
19 utf-8
20 我爱北京天安门
21 b'\xce\xd2\xb0\xae\xb1\xb1\xbe\xa9\xcc\xec\xb0\xb2\xc3\xc5'
22 我爱北京天安门
23 b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'

 

posted @ 2017-06-20 11:19  不知所以  阅读(264)  评论(0)    收藏  举报