Py001_02_06Python进制拾遗和编码问题

进制拾遗

  • oct 八进制
  • hex 十六进制
1
2
3
4
5
6
7
8
9
10
11
12
13
oct(1) # '0o1'
oct(7) # '0o7'
oct(8) # '0o10'


hex(9) # '0x9'
hex(10) # '0xa'
hex(11) # '0xb'
hex(12) # '0xc'
hex(13) # '0xd'
hex(14) # '0xe'
hex(15) # '0xf'
hex(16) # '0x10'

为何使用十六进制

  • 方便阅读
1
2
3
chr(97) # 'a'
bin(97) # '0b1100001'
hex(97) # '0x61'

编码

我们知道最早计算机使用的ascⅡ编码,因为是外国人发明的,没有考虑到中国的强大

后来随着祖国的强大陆续出现GB2312,GBK等编码

但是为了实现多个国家的统一ISO组织创建了Unicode字符集(万国码)

我们知道Unicode导致什么字符占用2-4个字节 这样很浪费空间

于是出现了UTF 编码(变长存储)

总结:UTF 是 unicode的编码设计的一种在存储和传输时节省空间的编码方案

可以参考我之前写的文章 计算机是如何存数据的

所有电脑现在都默认是unicode字符集,方便你以后的软件出口,或者10年前的项目不用改写

python3代码执行流程

参考链接

  • 在python3里内存里全是unicode编码
  • python3里默认是utf-8编码
  1. 解释器找到代码文件,把代码字符串按文件头定义的编码(#-- encoding:utf-8 --)加载到内存,转成unicode
  2. 把代码字符串按照语法规则进行解释,
  3. 所有的变量字符都会以unicode编码声明

结论就是:python3在内存里把你的编码转成unicode,即使你的输出环境是gbk也能正常显示

深坑 Python2并不会自动的把文件编码转为unicode存在内存里

如果你是utf-8编码,windows系统是gbk就会显示乱码

怎么办?人肉转

1
2
UTF-8 --> decode 解码 --> Unicode
Unicode --> encode 编码 --> GBK / UTF-8...

python只要出现各种编码问题,无非是哪里的编码设置出错了

常见编码错误的原因有:

  • Python解释器的默认编码
  • Python源文件文件编码(千万不要轻易改文件的编码不可逆,一旦失败就白玩了)
  • Terminal使用的编码
  • 操作系统的语言设置

结论:

py3

  • 文件默认编码是 utf-8
  • 字符串编码是 unicode

py2

  • 文件默认编码是 ascⅡ
  • 字符串编码是 ascⅡ
  • 如果文件头声明了gbk,那字符串的编码就是gbk