0917 字符编码及处理
1.字符编码
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535
,4个字节可以表示的最大整数是4294967295
。
由于计算机美国人发明的,最早只有127个字符编码至计算机,这个编码叫ASCIL
编码。
但处理中文至少用两个字节还不能和ASCIL
编码冲突,所以制定了GB2312
(后来变成GBK编码)编码。(日本把日文编到Shift_JIS
里,韩国把韩文编到Euc-kr
里,各国有各国的标准)
统一编码(Unicode)
Unicode将所有语言都统一编码至一套里,不会有乱码问题。
但ASCII编码是1个字节,而Unicode编码通常是2个字节。
字母A用ASCII编码是十进制的65,二进制的01000001;
字符0用ASCII编码是十进制的48,二进制的00110000,注意字符'0'和整数0是不同的;
汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
你可以猜测,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001。
这样一来,整个存储空间就多了一倍
出现UTF-8编码
这是一种‘可变长的编码’。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
记事本编辑时
会将读取的UTF-8字符转换成Unicode字符到内存中,编辑完成后,保存时再把Unicode字符转换为UTF-8保存在文件。
编码和解码
unicode编码 ---》(编码) utf8 从内存到硬盘
utf8 --》(解码) unicode 从硬盘到内存
现在内存只有unicode编码
python解释器,解释代码的流程
1.python解释器相当于文本编辑器,启动编辑器读入字符
python2默认的是ASCIL,python3默认UTF-8
中文 # gbk编码的中文加
2.==》识别代码 ==》print才能输出 ==》语法有没有问题
# coding : gbk
# 告诉python解释器用gbk去完成第一步,读入字符
3.== 》产生结果==》跑到终端--》字符编码
终端有一个特性:你的电脑是什么编码,就按什么编码来,Windows终端是GBK.
python2和python3的编码区别
python2
python2 有两种存储变量的形式,第一种:unicode;第二种:按照coding头设定来的
假设python2用utf8存储x='中文'
,当你print(x)
的时候,终端接收gbk的变量x,但是windows终端编码是utf8,会乱码
假设python2用unicode存储,终端接受的是unicode,windows终端编码是utf8还是gbk重要吗?不会乱码=
python3
python3只有一种存储变量的形式,unicode
python3用unicode存储,终端接收的是unicode,widonws终端编码是utf还是gbk不重要,不会乱码
终端的编码是GBK
文件的编码的gbk或utf-8
当python读取文件时。
第一步打开编辑器
第二部开始打开文件
# 这时需要变化编码,用unicode保存在内存中(python3)或者用字头coding 来指定(python2),不然会乱码
第三部输出到终端
# 如果是unicode编码不需要改变,终端是GBK,如果是其他指定编码就会报错,