字符编码
与字符编码有关的是文本文件内容和字符串数据类型,这两种情况都设计到字符编码的问题
字符编码指的是翻译或者转换二进制数字为人能看得懂的数字,或者将人们能看懂的数据以数字形式存储在计算机中。
字符编码表
01-ASCII码
计算机最初只考虑英文,所以诞生了ASCII表,这种表的有两个特点:
- 只有英文字符与数字的意义对应关系
- 一个英文字符对应1Bytes,1Bytes等于8位,8位可以表示256中字符
02-GBK码
由于时代的发展,其他国家的人们也接触到了计算机,各国人民自己也在自己的计算机中使用自己的计算机标准,中国人使用的是GBK字符编码标准,日本人使用的是Shift_JIS码编码标准,这样就可以识别自己国家自己的标准了。
GBK码采用16位-2Bytes来对接一个中文字符,可以表示六万五千多个汉字
03-Unicode编码
Unicode编码兼容万国字符,采用16位表示一个中文字符串,个别生僻字会采用32位或者64位。
如果我们使用unicode编码,内存中的老版本字符,必须先转换成unicode字符,再从unicode字符转换成人类的字符。
我们无法使用unicode完成GBK和Shift_JIS的转换,老的字符编码都可以转换成unicode,但是不能通过unicode互相转换。
04-UTF-8编码
UTF-8(unicode transform format 8)可以完成Unicode从2Bytes转换成1Bytes,把英文字符转换成1个Bytes,把汉字转换成3个Bytes,把日文和韩文用其他Bytes表示,完成了一个整体上的优化。
05-总结
- 内存固定使用Unicode,我们可以改变的是存入硬盘采用格式
- 英文+汉字 转换成Unicode再转换成GBK
- 英文+日文 转换成Unicode再转换成shift-jis
- 万国字符 转换成Unicode再转换成Utf-8
如果我们使用Shift-JIS编码存日文加中文,那么中文就会被存乱,以"???"的形式代替,此时数据就无效了。
如果我们使用GBK存储中文,然后使用Shift-JIS读取,此时就会读错,将编码转换为GBK就可以正常读取了。、
**文件存乱了解决方法:**编码方式应该设置成支持文件内容的字符编码。
**文件取乱了解决方法:**文件以什么方法写入硬盘,就要以什么编码方式读入内存
字符编码在Python
Python3默认编码utf-8,而Python2默认的编码为ASCII码,我们可以使用文件头修改默认的编码
#coding:utf-8
# 控制器管的是读的功能,告诉控制器我使用的是读的编码
info = '学习'
res = info.encode('gbk')
print(res.decode('gbk') # 正常不报错
print(res.decode('unicode')) # 报错
Python3的str类型默认存为Unicode编码,无论如何都不会乱码。
Python2需要使用**x=‘u’**来保证str类型不乱码,如果不强制,字符串值就会按照文件头指定的编码格式存入变量值的内存空间。