zoukankan      html  css  js  c++  java
  • 基础知识:字符编码

    一、字符编码

    1、什么实字符编码:将人识别的字符转换成计算机能识别的01,而转换的过程或者规则就是字符编码表。

    而这种字符编码表表示了一种对应关系。

    2、常用的字符编码表有:ascii、unicode、GBK、Shift_JIS、Euc-kr

    3、如何理解字符编码

    ①、电脑三大核心:cpu -内存-硬盘

    ②、软件及Python解释器读取文件过程:启动--读取--展示|解释执行

           计算机只认识数字

      很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?

      必须经过一个过程:
      

      字符--------(翻译过程)------->数字

      这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码

           计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号

           

      当然我们编程语言都用英文没问题,ASCII够用,但是在处理数据时,不同的国家有不同的语言,日本人会在自己的程序中加入日文,中国人会加入中文。

      而要表示中文,单拿一个字节表表示一个汉子,是不可能表达完的(连小学生都认识两千多个汉字),解决方法只有一个,就是一个字节用>8位2进制代表,位数越多,代表的变化就多,这样,就可以尽可能多的表达出不通的汉字

      所以中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符->数字的对应关系。

      日本人规定了自己的Shift_JIS编码

      韩国人规定了自己的Euc-kr编码(另外,韩国人说,计算机是他们发明的,要求世界统一用韩国编码,但世界人民没有搭理他们)

      因为此刻的各种标准都只是规定了自己国家的文字在内的字符跟数字的对应关系,如果单纯采用一种国家的编码格式,那么其余国家语言的文字在解析时就会出现乱码

      所以迫切需要一个世界的标准(能包含全世界的语言)于是unicode应运而生

      ascii用1个字节(8位二进制)代表一个字符

      unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节

      这时候乱码问题消失了,所有的文档我们都使用但是新问题出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效

      本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间

    4、字符编码总结:

    unicode与utf-8采用的是一张unicode编码表,utf-8是unicode编码表体现方式,变长存储数据
    变长优点:(大量数据都是以英文存在,所以utf-8空间更小)传输速度更快

    二、字符、编码、解码

    u' '              Unicode字符串,默认字符

    s1 = u'abc你好
    不好'    #
    代表换行符
    print(s1)
    
    
    >>>
    abc你好
    不好

    b' '             字节字符串

    s2 = b'abc123xb7xb7'
    print(s2)
    
    
    >>>b'abc123xb7xb7'

    r' '          原义字符串,不对字符串内存做任何操作

    s3 = r'abc你好
    不好'
    print(s3)
    
    >>>abc你好
    不好       #此时的换行符不起作用,因为原义字符串不做任何操作。

    编码encode与解码decode:

    编码:我们能看懂的  编给机器 看 的过程
    
    s='123哈哈'
    s1=bytes(s,encoding='utf-8')
    print(s1)
    
    >>>b'123xe5x93x88xe5x93x88'
    
    #结果解释:这里的x代表16进制的意思,一个16进制需要占用4个bit,所以2个16进制就是8个bit也就是1个字节(Bytes),所以xe5代表2个16进制一个字节,x93、x88各代表2个16进制,一个字节。后面三个重复,所以用utf-8编码,这里的一个汉字‘哈’占用3个字节。
    解码:把机器能看懂的 解释给我们人看的过程
    
    b1= b'xe4xbdxa0xe5xa5xbd'
    b2=str(b1,encoding='utf-8')
    print(b2)
    
    
    >>>你好

    编码、解码

    将u‘’字符串转成b‘’字符串   编码
    u1=u'你好'
    b1=u1.encode('utf-8')
    print(b1)
    
    
    >>>b'xe4xbdxa0xe5xa5xbd'
    将b‘’字符转换成u‘’字符     解码
    b2=b'xe4xbdxa0xe5xa5xbd'
    u2=b2.decode('utf-8')
    print(u2)
    
    >>>你好

    三 、文件操作

    待处理


    请相信自己

    当我们迷茫,懒惰,退缩的时候 我们会格外的相信命运 相信一切都是命中注定

    而当我们努力拼搏,积极向上时 我们会格外的相信自己

    所以命运是什么呢? 它是如果你习惯它 那它就会一直左右你

    如果你想挣脱它 那它就成为你的阻碍 可如果你打破了它 那它就是你人生的垫脚石!


    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    POJ 3258 (NOIP2015 D2T1跳石头)
    POJ 3122 二分
    POJ 3104 二分
    POJ 1995 快速幂
    409. Longest Palindrome
    389. Find the Difference
    381. Insert Delete GetRandom O(1)
    380. Insert Delete GetRandom O(1)
    355. Design Twitter
    347. Top K Frequent Elements (sort map)
  • 原文地址:https://www.cnblogs.com/suguangti/p/10600868.html
Copyright © 2011-2022 走看看