字符编码

   日期:2024-01-17     浏览:43    评论:0    

一、前言

1、任何一个程序都是先存放与硬盘上的,要想运行起来 必须先由硬盘读取到内存,之后cpu去内存中取指然后执行。

2、在运行的程序产生的数据最先都是存放在内存中的。

3、 计算机是基于电工作的 那么计算机只能识别电信号;
     计算机内部存储数据用的都是01010101的二进制数据。

4、文件的后缀名仅仅是给人看的 。因为对应计算机来说所有的数据都是0101010的二进制。

5、普通的文本编辑器和python解释器的工作流程
    相同:
        1.任何的程序要想运行都是先从硬盘读取到内存
        2.文本编辑器和python解释器都会去硬盘中读取你想要读取的文件内容   
    不同:
        3.文本编辑器将文件内容读取之后仅仅是展示给用户看
        而我们的python解释器会识别语法并执行python代码

6、字符编码研究的范围只针对文本文件 ,音频、视频这些不包含在内

二、概念

1、字符编码?

字符-------(标准)--------数字

2、字符编码表

存放的是字符与数字的对应关系

三、字符编码的发展史

1、一家独大
    计算机起源于美国
    美国人用英文交流 但是计算机只能识别二进制数据
    为了能够让计算机识别人类能够读懂的字符,这里面肯定有一个
    人类字符        >>>        计算机二进制数据
    中间的字符与数字的对应关系其实就是一张表
        ASCII码表
        这张表只记录了英文和数字的对应关系
        用8位(bit)来表示一个英文字符
        1bytes = 8bit
        1024bytes = 1KB
        1024KB  = 1MB
        1024MB = 1GB
       
 1024GB = 1TB

   1024TB = 1PB

   1024PB = 1EB
    

ASCII:只能识别英文字符
      特点:采用8bit对应一个英文字符
                8bit=》1Byte

    2、 群雄割据
        中国人也用得起计算机
            自己做一个汉字跟数字对应关系    GBK
            GBK表
                汉字、英文 跟数字的对应
                1bytes来表示英文
                2bytes来表示汉字
                    如果出现了生僻字可能还需要用3bytes甚至跟多的bytes
           

GBK:可以识别中文字符串与英文字符
    特点:采用16bit对应字符,该字符可以是英文字符、也可以是中文字符

        日本人也用得起计算机
            自己做一个汉字跟数字对应关系    shift_JIS
              shift_JIS表
                日文、英文 跟数字的对应
                
        韩国人也用得起计算机
            自己做一个汉字跟数字对应关系    Euc_kr
            Euc_kr表
                韩文、英文 跟数字的对应

我们在输入中文字符的时候
    1.内部基于GBK翻译成了对应的二进制数据 在内存
    2.然后将基于GBK编码的二进制数据刷到硬盘 永久保存
    3.将硬盘中基于GBK编码的二进制数据读取到内存之后按照GBK编码的对应关系翻译成对应的中文

3、天下一统
        万国码 unicode
        兼容万国
        并且跟之前所有国家的编码都有对应关系
        1990开始研究的 1994年才开始正式使用
        
        所有的字符都是用2bytes来存储
            英文用2bytes
            中文也用2bytes

unicode:可以识别万国字符
        特点:2Bytes对应一个字符

4、衍生出utf-8

utf-8
        1Byte对应英文字符
        3Byte对应一个中文字符

四、总结

1、群雄割据:
英文字符--------------内存:ASCII二进制数--------------->硬盘:ASCII二进制数
中文英文字符--------------内存:GBK二进制数--------------->硬盘:GBK二进制数
日文英文字符--------------内存:shiftJIS二进制数--------------->硬盘:shiftJIS二进制数
韩文英文字符--------------内存:Euc-Kr二进制数--------------->硬盘:Euc-Kr二进制数

2、过渡阶段:
中文英文字符------------内存:unicode=========gbk============>硬盘:GBK二进制数
日文英文字符------------内存:unicode=========shifJIS========>硬盘:shiftJIS二进制数
韩文英文字符------------内存:unicode=========Euc-Kr=========>硬盘:Euc-Kr二进制数
万国字符----------------内存:unicode=========utf-8==========>硬盘:utf-8二进制数


内存固定使用:unicode
我们可以改变的是从内存写入硬盘采用的编码格式


3、分久必合:
万国字符----------------内存:unicode=========utf-8==========>硬盘:utf-8二进制数
万国字符----------------内存:utf-8==========================>硬盘:utf-8二进制数

五、遇到的问题与解决办法

乱码问题:
    1、存的时候乱了:采用的字符编码表无法识别输入的字符
        存的时候就已经乱了,是无法补救的,取的时候一定也乱了

        解决方法:存入硬盘的编码格式应该用utf-8格式


    2、存的时候没有乱码:采用的字符编码表可以识别输入的字符
        但是取的时候乱码了:采用的字符编码表与当初存的时候用的不是同一张表

        解决方法:存的时候用什么编码,取的时候一定要用同样的编码格式


与运行python程序有关的乱码问题:
    1、保证运行python程序的前两个阶段不乱码
        在python文件的开头加一行:
            #coding:文件存的时候用的编码格式

ps:

1、在python3中字符串类型的值在内存中都是unicode格式的数字

2、在python2中字符串类型的值在内存中都是文件头指定编码格式的数字

  python2如果在字符串前加前缀u就把字符串强制存成unicode格式,推荐使用

六、知识扩充:

首先来说,编码即是密码本,编码记录的就是二进制与文字之间的对应关系,现存的编码本有:

ASCII码:包含英文字母,数字,特殊字符与01010101对应关系。

  a  01000001  一个字符一个字节表示。

GBK:只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系。

  a  01000001  ascii码中的字符:一个字符一个字节表示。

  中 01001001 01000010  中文:一个字符两个字节表示。

 Unicode:包含全世界所有的文字与二进制0101001的对应关系。

  a  01000001 01000010 01000011 00000001        

  b  01000001 01000010 01100011 00000001        

  中 01001001 01000010 01100011 00000001

UTF-8:包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)。

     a   01000001  ascii码中的字符:一个字符一个字节表示。

  To 01000001 01000010   (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示。

  中  01001001 01000010 01100011  亚洲文字;一个字符三个字节表示。首先来说,编码即是密码本,编码记录的就是二进制与文字之间的对应关系,现存的编码本有:

ASCII码:包含英文字母,数字,特殊字符与01010101对应关系。

  a  01000001  一个字符一个字节表示。

GBK:只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系。

  a  01000001  ascii码中的字符:一个字符一个字节表示。

  中 01001001 01000010  中文:一个字符两个字节表示。

 Unicode:包含全世界所有的文字与二进制0101001的对应关系。

  a  01000001 01000010 01000011 00000001        

  b  01000001 01000010 01100011 00000001        

  中 01001001 01000010 01100011 00000001

UTF-8:包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)。

     a   01000001  ascii码中的字符:一个字符一个字节表示。

  To 01000001 01000010   (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示。

  中  01001001 01000010 01100011  亚洲文字;一个字符三个字节表示。

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服