02 字符编码
Posted yang1333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了02 字符编码相关的知识,希望对你有一定的参考价值。
02 字符编码
但凡涉及到字符的概念,文本文件的内容,python语法中有一种语法是字符串的定义。
软件运行在内存
x = 字符串 第三步有效
涉及到字符编码 -- 》 1~2阶段
2个地方 --》 1~2j阶段(读) -->第三阶段(存)
上 --》 10 --》 二进制 (字符编码表)
存:上 ——翻译——》 二进制
取:下 《--------翻译---------- 二进制
总结:什么是字符编码表,就是字符与数字对应得关系表。
核心
发展史:独大 -》 多乱 -》 统一
美国:ascii码表采用8位二进制数对应一个英文字符,只支持引文字符
中国:bgk 支持英文字符,中文字符。采用8位二进制数对应英文数字(256),采用16位二进制数对应中文字符(56636)
日本:血的JIS 韩国:法克kr
万国码:unicode, 采用16位二京指数(2Bytes)对应一个中文字符,个别生僻会采用4Bytes,8Bytes。注意:内存中同一使用unicode。
上 --》 unicode(内存) --》各国码(硬盘)
下 《--- unicode(内存) 《--- 各国码(硬盘)
1、兼容万国字符
2、兼容万国编码表对应关系(妥协)
字符编码之间不可以转(GBK不能转成ascii, 字符的对应关系不一样,不可以转),字符编码之间可以通过unicode中间介质,进行读写。
utf-8: Underwater Communications SystemTransformation Format
英文 --》 1Bytes
汉字 --》 3Bytes
结论:
内存固定使用unicode,我们可以改变的是存入硬盘采用格式
英文+汉字 -》 unicode -> GBK
英文+日文 --》 unicode --> shift-jis
万国符 --》 unicode --> utf-8
编码:
字符 --》 unicode
unicode --》 老的编码 Gbk、Shift-jis
解码:
unicode -》 字符
老的编码 Gbk、Shift-jis -》 unicode
为什么说unicde是过渡版本?
1、对应王国码
2、最重要的是
也就是说,目前unicode主要是争对于老的版本的兼容,老的没了,它就没有意义了
村乱:
致命,存乱了。文件存的时候,字符要是硬盘中的编码格式所支持的格式。
取乱:
不致命,取乱了。文件是以什么编码格式存入硬盘的,就应该以什么编码格式读入内存。
python中
文件头部解码标识
pycharm这个文本编辑器默认编码就是utf-8(存)
python3解释器默认解码就是utf-8
python解释器按照默认解码方式先读取文件首行,读取首行以后,按照首行指定的解码声明头。
核型法则:保证python程序不乱吗的前提条件,就是你的文本编辑器默认是用什么方式编码存的,你就应该使用什么文件头部解码标识。
第三个阶段:
python3的str类型,存到内存,默认直接存成unicode,不会露娜吗
python2的str类型不会存成unicode到内存。将python2字符串类型使用u‘str’存成unicode,如果你的str使用的是英文可以不加,如果你是中文就必须在字符串前加u
了解:
python2解释器又2种字符串类型,一种str,另外一种unicode。
x='上' --》 str类型(会按照文件头指定的编码格式存入指定的内存空间) print会有这种优化机制,不能打印,放到列表中展示。
x=u'上' --> unicode类型(强制存成unicode)
python解释器中演示:
GBK会拿每一组1个byges中8个比特位的前一位,作为英文与中文的标识信息,用来判断,怎么取。如果首位是1,那么取2个bytes,如果首位是0,那么取1个bytes。
补充:python2中打印可以不加括号。
打印存入内存gbk的编码,默认使用文件头gbk解码打印到终端,但是是使用终端默认的解码方式。windows中使用GBK,MAC使用utf-8.
补充:python终端是utf-8
打印:'xc9xcf' -> GBK -> unicode ->显示 (你打印是现实到终端)
如果以后用python2中写程序,定义字符串的时候,一定要在前面加u
python3编码解码:
(HR)egon面试python冷知识:你知道什么叫c9cf?哦!不会啊!下一个。
x = '上'
res = x.encode('gbk') # unicode - > GBK # 编码
print(res, type(res))
res.decode('gbk')
总结:
第一阶段启动python解释器
python3第二个阶段,涉及到python解释器使用解码方式加载文件,默认使用utf-8解码。
python3第三个阶段,涉及到语法问题,存字符串到内存,默认使用unicode
一、知识储备
1、三大核心硬件
https://www.cnblogs.com/yang1333/p/12379991.html
2、文本编辑器读取文件内存的流程
https://www.cnblogs.com/yang1333/p/12404248.html
3、python解释器解释执行文件的流程
https://www.cnblogs.com/yang1333/p/12404248.html
总结:python解释器与文件本编辑的异同
二、字符编码介绍
1、什么是字符编码表?
- 就是一张字符与数字对应的关系表。
??字符编码表的发展史??
1、阶段一:一家独大 ASCII
ASCII:只采用8位二进制数(1Bytes)对应一个英文字符。
现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表
2、阶段二:诸侯割据、天下大乱 ASCII、GBK、Shift-JIS
GBK:采用8位二进制数(1Bytes)对应一个英文字符,采用16位二进制数(2Bytes)对应一个中文字符。
- 为了让计算机能够识别中文和英文,中国人定制了GBK。
- 为让计算机能够识别自己国家的字符外加英文字符,各个国家都制定了自己的字符编码表。此时,美国人用的计算机里使用字符编码标准是ASCII、中国人用的计算机里使用字符编码标准是GBK、日本人用的计算机里使用字符编码标准是Shift_JIS
此时无论是存还是取由于采用的字符编码表一样,所以肯定不会出现乱码问题,但问题是在美国人用的计算机里只能输入英文字符,而在中国人用的计算机里只能输入中文字符和英文字符....,毫无疑问我们希望计算机允许我们输入万国字符均可识别、不乱码,而现阶段计算机采用的字符编码ASCII、GBK、Shift_JIS都无法识别万国字符,所以我们必须定制一个兼容万国字符的编码表
3、阶段三:分久必合 unicode
unicode:采用16位二进制数(2Bytes)对应一个字符(注意:2个字节无论是对英文还是中文都是对于1个字符),个别生僻字采用4Byets、8Bytes。
- unicode于1990年开始研发,1994年正式公布。
很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生的缘由
4、编码与解码(重点)
- 编码:由字符转换成内存中的unicode 或 由其他编码转换成内存中的unicode。
- 解码:由内存中的unicode转换成字符 或 由内存中的unicode转换成其他编码。
- 注意:unicode是存在内存当中
5、utf-8的由来
utf-8:采用8位二进制数(1Bytes)对应一个英文字符,采用24位二进制数(3Bytes)对应一个中文字符。
- 注意:如果保存到硬盘的是GBK格式二进制,当初用户输入的字符只能是中文或英文,同理如果保存到硬盘的是Shift_JIS格式二进制,当初用户输入的字符只能是日文或英文……如果我们输入的字符中包含多国字符,那么该如何处理?
- 理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的,但由于unicode固定使用两个字节来存储一个字符,如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可),然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
那为何在内存中不直接使用utf-8呢?unicode更像是一个过渡版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景,即硬盘里放的都是utf-8格式,此时unicode便可以退出历史舞台,内存里也改用utf-8,天下重新归于统一
??总结字符编码??
- 字符编码对应字符关系:
- ASCII:只采用1个字节对应一个英文字符
- GBK:采用1个字节对应一个英文字符,采用2个字节对应一个中文字符。
- unicode:采用2个字节对应一个字符,生僻字采用4个字节、8个字节。(注意:无论是英文还是中文,都是采用2个字符)
- utf-8:采用1个字节对应一个英文字符,采用3个字节对应一个中文字符。
- 目前内存使用的编码: unicode
- 注意:unicode兼容万国码,与万国字符都有对应关系。
- unicode有2个作用:1、兼容万国字符 2、兼容万国字符编码表对应关系(unicode妥协于此,也就是它目前存在的主要作用)
- 目前硬盘中使用的编码:utf-8、GBK、Shift-JIS
- 内存固定使用unicode,我们可以改变的是存入硬盘采用的格式
- 英文+汉字(文本编辑器) ---》 unicode(内存) ---》GBK(硬盘)
- 英文+日文(文本编辑器) ---》 unicode(内存) ---》Shift-JIS(硬盘)
- 万国字符(文本编辑器) ---》 unicode(内存) ---》utf-8(硬盘)
三、字符编码的应用
1、我们学习字符编码就是为了存取字符时不发生乱码问题:
# 1、内存中固定使用unicode无论输入任何字符都不会发生乱码
# 2、我们能够修改的是存/取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种:存乱了,读乱了
# 2.1 存乱了:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了
# 2.2 读乱了:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了
??总结文件存、取乱码问题??
- 保证存的时候不乱:
- 保证读的时候不乱:
1、文本编辑器nodpad++存取文本文件
2、python解释器执行文件的前两个阶段
- 执行py文件的前两个阶段就是python解释器读文本文件的过程,与文本编辑读文本文件的前两个阶段没人任何区别,要保证读不乱码,则必须将python解释器读文件时采用的编码方式设置为文件当初写入硬盘时的编码格式,如果没有设置,python解释器则才用默认的编码方式,在python3中默认为utf-8,在python2中默认为ASCII,我们可以通过指定文件头来修改默认的编码
3、python解释器执行文件的第三个阶段
- 在Python3中,字符串类的值都是使用unicode格式来存储
- 由于Python2的盛行是早于unicode的,因此在Python2中是按照文件头指定的编码来存储字符串类型的值的(如果文件头中没有指定编码,那么解释器会按照它自己默认的编码方式来存储‘上’),所以,这就有可能导致乱码问题
- 存文件
- 声明读取文件的编码读文件
4、字符串encode编码与decode解码的使用
总结
3、python解释器默认读文件的编码
python3默认:utf-8
python2默认:ASCII
指定文件头修改默认的编码:
在py文件的首行写:
#coding:gbk
4、保证运行python程序前两个阶段不乱码的核心法则:
指定文件头
# coding:文件当初存入硬盘时所采用的编码格式
5、
python3的str类型默认直接存成unicode格式,无论如何都不会乱码
保证python2的str类型不乱码
x=u'上'
6、了解
python2解释器有两种字符串类型:str、unicode
# str类型
x='上' # 字符串值会按照文件头指定的编码格式存入变量值的内存空间
# unicode类型
x=u'上' # 强制存成unicode
以上是关于02 字符编码的主要内容,如果未能解决你的问题,请参考以下文章