Python-08
@(Python)
字符编码
什么是字符编表
- 把人类的字符,解释为计算机能识别的二进制,这种转换遵循的标准就是字符编码表
- 字符编码表记录了人类字符与数字的对应关系
字符编码表的种类和使用
ASCII编码表
- ASCII编码表用于,英文和二进制的对照关系,存取都是以ASCII格式的二进制存取
- 一个英文字母占
8bit
- ASCII编码表只能解释英文符号
GBK编码表
- GBK编码表用于,中文和二进制的对照关系,存取都是以GBK格式的二进制存取
- 一个中文符号占
16bit
,一个英文字母占8bit
- GBK编码表只能解释中、英文符号
unicode编码表
unicode
编码格式,可以跟其他所有的编码格式互相转码
unicode
编码只在内存中使用,目前所有编码字符的字符在内存中都是以unicode
格式的二进制形式呈现,并且只有unicode
在内存中,其他字符编码都在硬盘上unicode
把全世界的字符都建立好对应关系,保证了在内存中不出现乱码unicode
的好处是可以跨平台,在任何平台打印都不会乱码unicode
使用2Bytes(16bit)
表示一个字符,缺点是小于2Bytes
的字符也会占用2Bytes
的空间(不足16bit
的用0
补齐)unicode
编码表和其他字符编码表的对应关系,如下图:
utf-8编码表
utf-8
英文全称unicode tranform format-8
,是unicode
编码表的转换版本
- 作用是,解决了
unicode
占用空间的缺点,将内存中unicode
编码后的二进制,更节省空间的存入磁盘 utf-8
编码表没有和各个国家的对应关系,因此内存中不用utf-8
utf-8
用1Bytes
表示英文,用3Bytes
表示中文
总结:
- 因为历史原因,各个国家为了用自己的语言使用计算机,都有自己编码表,为了进行统一,出现了
unicode
编码来进行过度,utf-8
编码表用来逐步代替其他的编码表
乱码的原因是什么?
- 存的时候是以A编码格式存,读的时候用B编码格式读,就会出现乱码
如何避免乱码?
- 要保证存取文件不乱码,应该开始用什么编码存的,以后就用什么编码读
Python2和Python3在字符编码上的区别
Python3
解释器默认的字符编码是UTF-8
Python2
解释器默认的字符编码是ASCII
python2
会根据文件头编码的格式,将变量值存到内存,如果想要存为unicode
就需要在变量值前加u
,比如x=u'a'
,u
代表unicode
Python3
不管文件头是什么编码格式,都会转化为unicode
存放在内存中
如何指定编码文件头
- 文件开头格式:
#coding:当初存的时候的编码
的形式,比如#coding:gbk
指定读的时候用什么编码读Linux
中使用#!/usr/bin/env python
python2中查看值在内存中,实际存为的十六进制(都是二进制,以十六进制显示)
在Python2中有两种字符串编码格式
unicode
格式:x=u'上'
unicode
编码后的结果,如果文件头为#coding:utf-8
,那么'上'
被存为utf-8
格式- 在Python3中只有一种字符串编码格式:
unicode
格式:x='上'
内存中固定使用unicode编码,唯一能改变的是存储到硬盘时
编码与解码
- 编码形式:
unicode --- encode编码 ---> gbk
,unicode
只能编码,不能解码- 解码形式:
unicode <--- decode解码 --- gbk
总结
Python2总结:
- 在Python2中的字符串类型
str
都是unicode按照文件头的指定的编码,编码之后的结果 - 在Python2中也可以制造unicode编码的字符串,需要在字符串前加u
Python3总结:
- 在Python3中的字符串类型
str
都是unicode
编码的 - 所以Python3中的字符串类型可以编码成其他字符编码格式,编码的结果是bytes类型
- Python3中要从内存写入硬盘,必须要从
unicode
转化成bytes
类型,即只有其他编码格式才能在硬盘上保存
bytes
可以当成二进制看- 字符编码只和文本文件有关,与视频、音频、图片等文件无关