一、编码
常见的编码比较:
ascii:1个字节
unicode:2个字节
utf-8:英文1个字节,汉字3个字节
二、一个编码问题
问:如下代码设置了在代码中添加了coding: utf-8,但是在cmd下面运行的时候还是输出乱码,这是什么情况?
test.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print “你好”
答: cmd默认的编码是GBK格式的,所以只在代码里写了coding: utf-8也是不行的。
解决方案:
1.修改cmd的编码为utf-8格式:
此方法这里就不详述了,参考链接
2.使代码以gbk的格式输出:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
temp = "你好"
temp_unicode = temp.decode('utf-8') #把utf-8解码成unicode格式
temp_gbk = temp_unicode.encode('gbk') #把unicode编码成gbk格式
print temp_gbk
python3和与python2的差异:
对于上面解决方案中的代码可能只存在于python2中,在python3中情况就大不一样了。
在python3中utf-8编码能直接转成gbk格式的编码,在python3中代码可以写成下面这样:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
temp = "你好"
temp_gbk = temp.encode('gbk') #在python3中utf-8编码能直接转成gbk格式的编码
print temp_gbk
三、不同场景下的字符编码方式
在现在计算机中通用的字符编码工作方式:在内存中统一使用unicode,需要保存到硬盘或要传输的时候就会转为utf-8。
- 使用记事本编辑的时候,文件读取的utf-8字符被转换为unicode字符到内存里,编辑完成后,保存的时候再把unicode转换为UTF-8保存到文件里
- 浏览网页时,服务器会把动态生成的unicode转换为utf-8,再传输到浏览器。因此会在网页源码上有类似的信息,表示该网页用的就是utf-8编码。
四、字符串与字节
补充
bytes类型(和int,str类似的数据类型)
s = "你好"
for i in s:
bytes_list = bytes(i,encoding='utf-8') #bytes可以把字符串转换为字节
print(bytes_list)
for j in bytes_list: #在迭代输出16进制的字节时,默认以10进制方式输出
print(j)
OUTPUT:
b'\xe4\xbd\xa0'
228
189
160
b'\xe5\xa5\xbd'
229
165
189
字符串与字节的转换
a ="你好"
b = bytes(a,encoding='utf-8') #把字符串转换为字节类型
c = str(b,encoding='utf-8') #把字节转换为字符串类型
print(b)
print(c)
OUTPUT:
b'\xe4\xbd\xa0\xe5\xa5\xbd'
你好
应用场景
两个server互相通信,如果使用utf-8编码,则通信过程如下: