20190917 字符编码

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,如果是其他指定编码就会报错,
原文地址:https://www.cnblogs.com/fwzzz/p/11534349.html