字符编码表就是一张字符与数字的对应关系的表内存 上 ------------------->翻译 ------------------>01011010 上 <-------------------- 翻译<-----------------01011010 ASCII表: 1、只支持英文字符串 2、采用 8 位二进制数对应一个英文字符串 GBK 表: 1、支持英文字符、中文字符 2、采用 8 位(8bit=1Bytes)二进制数对应一个英文字符串 采用 16 位(16bit = 2Bytes)二进制数对应一个中文字符串 unicode(内存中统一使用 unicode): 1、兼容万国字符,与万国字符都有对应关系 2、采用 16 位(16bit=2Bytes)二进制对应一个字符串 个别生僻会采用 4Bytes 、8Bytes 人类输入的字符------------->unicode格式数字(内存中)<------------->GBK格式二进制(硬盘) 人类输入的字符------------->unicode格式数字(内存中)<------------->Shift_JIS格式二进制(硬盘) 注:GBK 与 Shift_JIS字符编码都可以转为 unicode,但是它们两之间不能通过 unicode互转 UTF-8: 1、英文采用1 个 Bytes 2、中文采用 3 个 Bytes window :默认采用 GBK mac :默认采用 utf-8 linux:默认采用 utf-8 python 文件的执行过程:1、先将 python 解释器启动 2、调用系统操作,将文本文件内容由硬盘读入内存 3、解释器解释并执行刚刚读入内存的文本内容,识别相关语法。 python 解释器: python 2:默认的是 ascii 码 python 3:默认的是 utf-8 码 为了能够在 python2 解释器读入文本文件不乱码,可以在文本文件开头指定编码格式,这样 python2 解释器将内容读入内存时就会知道 文本内容使用的编码格式。 保证了运行 python 程序前两个阶段不乱码的核心是指定编码格式,即用什么编码存入硬盘的: 在 文件首行写入包含 # 号在内的以下内容:
解释器会先用默认的编码方式读取文件的首行内容,由于首行是纯英文组成,而任何编码方式都可以识别英文字符。 例: 在 python2 中
python2:str 有两种类型:str 和 unicode str类型:
unicode 类型:
保证python2 的 str 类型不乱码:
python3:str 类型默认直接存为 unicode 格式,无论如何都不会乱码 结论:1、内存中固定使用的是 unicode、这是不能改变的,我们可以改变的是存入硬盘的格式
2、文本文件存取乱码问题 1)存乱了: 例:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了 解决方法是:将文本文件编码格式设置成支持文件内字符串的格式 2)读乱了: 例:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了 解决方法是:文件以什么编码格式存如硬盘,就应该以什么编码格式读入内存。 总结:1、保证存的时候不乱:在由内存写入硬盘时,必须将编码格式设置为支持所输入字符的编码格式 2、保证读的时候不乱:在由硬盘读入内存是,必须采用与写入硬盘时相同的编码格式 二 编码与解码编码: 由字符转换成内存中 unicode,以及由 unicode转换成其他编码(存在硬盘里)的过程,都称为编码encode 字符-------------encode-------------》unicode---------encode---------》GBK、utf-8、Shift_JIS 解码: 由内存中的 unicode 转换成字符,以及由其他编码(存在硬盘里)转换成 unicode 的过程,都被称为解码 decode (utf-8、Shift_JIS、GBK--------decode----------》unicode-----------decode---------------》字符 补充: 浏览网页的时候,服务器会把动态生成的 unicode 内容转为 UTF-8 再传输到浏览器 如果服务端 encode 的编码格式是utf-8,客户端内存中收到的也是 utf-8 编码的结果 来源:https://www./content-4-657401.html |
|