ASCII表
1、只支持英文字符串
2、采用8位二进制对应一个英文字符串
ASCII表的特点:
1、只有英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
GBK表
- 支持英文字符、中文字符
- 采用8位(8Bit=1Bytes)二进制对应一个英文字符串
- 采用16位(16Bit=2Bytes)二进制对应一个中文字符串
GBK表的特点:
1、只有中文字符、英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes 一个中文字符对应2Bytes
Unicode
很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。
此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的;
面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode第二大特点产生的缘由
注意:内存中统一使用Unicode(文本编辑器输入任何字符在内存中都是Unicode编码的)
- 兼容万国字符,与万国字符编码都有对应关系
- 采用16位(16Bit=2Bytes)二进制数对应一个中文字符串,个别生僻字会采用4Bytes,8Bytes
# 英文字符可以被ASCII识别
英文字符--->unciode格式的二进制--->ASCII格式的二进制
# 中文字符、英文字符可以被GBK识别
中文字符、英文字符--->unicode格式的二进制--->gbk格式的二进制
# 日文字符、英文字符可以被shift-JIS识别
日文字符、英文字符--->unicode格式的二进制--->shift-JIS格式的二进制
Unicode表
内存
字符---------------------Unicode格式的数字-----------------
| |
| |
| |
硬 盘 |
| |
| |
| |
GBK格式的二进制 Shit-JIS格式的二进制
老的字符编码都可以转成Unicode,单不能通过Unicode互转
UTF-8
- 英文 ----》 1Bytes
- 汉字 ----》 3Bytes
结论
-
内存固定使用Unicode,我们可以改变的是存入硬盘采用格式
英文 + 汉字 ----》 Unicode ----》 gbk 英文 + 日文 ----》 Unicode ----》 shift-jis 万国字符 ----》 Unicode ----》 utf-8
-
文本文件存取乱码问题
存乱了:解决方法是,编码格式应该设置成支持文件内容字符串的格式
取乱了:解决方法是,文件是以什么编码格式存入硬盘的,就应该以什么编码格式读入内存。
-
python默认读文件的编码:
python3
默认utf-8
python2
默认ASCII
指定文件编码
在
py
文件的首行写、只需要在主文件加文件头。# coding:utf-8 (按当初存入的编码为准)
-
保存运行python程序的前两个阶段不乱码的核心法则
指定文件头
# coding:文件当初存入硬盘时所采用的编码格式
-
python3
的str
类型默认直接存成Unicode
格式,无论如何都不会乱码保存
python2
的str
类型不乱码x = u'上'
在字符串前面加一个u
强制转成Unicode -
了解
python2
解释器有两种字符串类型:str
以及Unicode
# str类型 x = '上' # 字符串值会按照文件头指定的编码格式存入变量值的内存空间 # Unicode类型 x = u'上' # 强制存成Unicode
编码:Unicode 转成 其他编码
解码:其他编码转成 Unicode
用什么去编码,就要用什么去解码,推荐用
utf-8
去编码和解码x = '上' res = x.decode('gbk') # Unicode编码成gbk print(res, type(res)) >>> b'\xc9\xcf' <class 'bytes'> text = res.decode('gbk') print(text) >>> 上
-
默认编码
pycharm
默认的终端编码是utf-8
- mac的终端默认也是
utf-8
win10 cmd
的终端默认是GBK
最后再提示一下,Python只要出现各种编码问题,无非是哪里的编码设置出错了
常见编码错误的原因有:
- Python解释器的默认编码
- Python源文件文件编码
- Terminal使用的编码
- 操作系统的语言设置