字符编码
# 字符编码
# 字符编码表
- 就是字符与数字的对应关系表
- 起到人与计算机交互的翻译作用
# 编码表发展
阶段1 - ASCII表
ASCII支持英文。
8位二进制对应一个英文字符。
阶段2 - GBK表
GBK支持中文、英文。
8位二进制对应一个英文字符。
16位二进制对应一个中文字符。
阶段3 - Unicode表
兼容万国字符,且与其他字符编码都有对应关系。
16位二进制对应一个字符。
个别生僻字会采用4或8位进制。
# utf-8
在Unicode表的基础上,使字符编码占用的空间更加精简。
会将英文字符转换成 1 bytes、汉字字符转换为 3 bytes。
其他国家的也有精简,但我们关注中英文即可。
# 内存中的编码
现在内存中统一使用Unicode字符表,在保存到磁盘时,可以转换为任意其他编码。
英文字符 —> unciode格式的数字 —> ASCII格式的数字。
中文字符、英文字符 —> unicode格式的数字 —> gbk格式的数字。
# 乱码的解决
存乱了,编码格式应该设置成支持文件内容字符的格式。
取乱了,文件以什么编码格式存入硬盘,就应该以什么编码格式读入内存。但如果存取都使用utf-8,则可以不用考虑这些问题。
# 结论
内存固定使用unicode,我们能改变的是存入硬盘采用的编码格式。
由于unicode比较大,所以在写入磁盘时,会带来更多的IO延迟。所以采用更加精简的utf-8。
# python如何保存字符串类型
# python2中
因为python2诞生时,unicode还没出来。如果文件头没有声明编码格式,还想让字符串不乱码,则需要在字符串前面加u,表示强制以unicode编码存入内存。否则会按照文件头指定的编码格式存入变量值的内存空间。
如:
x=u"上下"
# python3中
str类型的值,默认以unicode格式存储到堆区。
# python的编码与解码
# 指定默认编码 - coding
指定解释器读取py文件时用的编码格式,可保证py文件在被解释器读取时不会乱码。
python2中,默认使用ASCII。
python3中,默认使用utf-8。
指定解释器默认使用的编码:# -*- coding: utf-8 -*-
或者 # coding=utf-8
在py文件的头部声明编码格式,放在指定解释器行的下面。
例如:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
2
# 字符串编码 - encode
str.encode("编码格式")
指定编码格式对字符串进行编码,unicode —> 指定编码格式。
例如:
"测试".encode("utf-8")
>> 输出 b'\xe6\xb5\x8b\xe8\xaf\x95'
2
# 字符串解码 - decode
str.decode("编码格式")
指定编码格式对字符串进行解码,指定编码格式 --> unicode。
例如:
b'\xe6\xb5\x8b\xe8\xaf\x95'.decode("utf-8")
>> 输出 '测试'
2
# bytes类型转换
bytes("测试", encoding="utf-8")
同等于
"测试".encode("utf-8")