Py001_02_06Python进制拾遗和编码问题
进制拾遗
- oct 八进制
- hex 十六进制
1 | oct(1) # '0o1' |
为何使用十六进制
- 短
- 方便阅读
1 | chr(97) # 'a' |
编码
我们知道最早计算机使用的ascⅡ编码,因为是外国人发明的,没有考虑到中国的强大
后来随着祖国的强大陆续出现GB2312,GBK等编码
但是为了实现多个国家的统一ISO组织创建了Unicode字符集(万国码)
我们知道Unicode导致什么字符占用2-4个字节 这样很浪费空间
于是出现了UTF 编码(变长存储)
总结:UTF 是 unicode的编码设计的一种在存储和传输时节省空间的编码方案
可以参考我之前写的文章 计算机是如何存数据的
所有电脑现在都默认是unicode字符集,方便你以后的软件出口,或者10年前的项目不用改写
python3代码执行流程
- 在python3里内存里全是unicode编码
- python3里默认是utf-8编码
- 解释器找到代码文件,把代码字符串按文件头定义的编码(#-- encoding:utf-8 --)加载到内存,转成unicode
- 把代码字符串按照语法规则进行解释,
- 所有的变量字符都会以unicode编码声明
结论就是:python3在内存里把你的编码转成unicode,即使你的输出环境是gbk也能正常显示
深坑 Python2并不会自动的把文件编码转为unicode存在内存里
如果你是utf-8编码,windows系统是gbk就会显示乱码
怎么办?人肉转
1 | UTF-8 --> decode 解码 --> Unicode |
python只要出现各种编码问题,无非是哪里的编码设置出错了
常见编码错误的原因有:
- Python解释器的默认编码
- Python源文件文件编码(千万不要轻易改文件的编码不可逆,一旦失败就白玩了)
- Terminal使用的编码
- 操作系统的语言设置
结论:
py3
- 文件默认编码是 utf-8
- 字符串编码是 unicode
py2
- 文件默认编码是 ascⅡ
- 字符串编码是 ascⅡ
- 如果文件头声明了gbk,那字符串的编码就是gbk