zoukankan      html  css  js  c++  java
  • 字符编码转换

    什么是字符:字符编码(英语:Character encoding)也称字集码.大白话就是字符对应的0101这样的数字  就是字符跟数字一一对应的关系

    比如:hello

    h --> 0101010

    e --> 0101101

    l --> 10101010

    以上就是字符编码的表现形式

     

    计算机要想工作必须通电,即用‘电’驱使计算机干活,也就是说‘电’的特性决定了计算机的特性。电的特性即高低电平(人类从逻辑上将二进制数1对应高电平,二进制数0对应低电平),关于磁盘的磁特性也是同样的道理。结论:计算机只认识数字
    很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?
    
    必须经过一个过程:   #字符--------(翻译过程)------->数字   #这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码

     

    字符编码的发展史与分类(了解)

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

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

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

     

    gb2312编码:

     

      美国人使用的ascii 8bit位对应的是一个字母 也就是说8bit位(1Byte字节)等于一个字母 比如H进行转换: (H 转换成二进制--> 01001000(占用磁盘8bit位)).

     

      中国要使用计算机,就这时候8bit位不够使用了(因为只能表示256个字符,但是中国汉字太多了,8bit这时候明显不够用了),因为8bit最多可以表示256个字符,这时候中文汉字太多了,这时候中国人就想出来,我们可以用2个8bit(2Byte字节)位来表示一个中文;比如"你"进行转换(你 转换成二进制-->10011110 1100000),这时候中文就可以表示到65535个汉字

     

        utf-8编码占用3个字节但超大字符集中的更大多数汉字要占4个字节(在unicode编码体系中,U+20000开始有5万多汉字)。

     

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

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

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

    这时候问题出现了,精通18国语言的小周同学谦虚的用8国语言写了一篇文档,那么这篇文档,按照哪国的标准,都会出现乱码(因为此刻的各种标准都只是规定了自己国家的文字在内的字符跟数字的对应关系,如果单纯采用一种国家的编码格式,那么其余国家语言的文字在解析时就会出现乱码)

    所以迫切需要一个世界的标准(能包含全世界的语言)于是unicode应运而生(韩国人表示不服,然后没有什么卵用)

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

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

    例:

    字母x,用ascii表示是十进制的120,二进制0111 1000

    汉字已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101

    字母x,用unicode表示二进制0000 0000 0111 1000,所以unicode兼容ascii,也兼容万国,是世界的标准

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

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

     

    #了解

    bit(二进制位-->最小的单位)

    1Byte字节 = 8bit

    1KByte = 1024B

    1MB = 1024KB

    1GB = 1024MB

     

    ython 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用strbytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然)。 

     

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分
    str : 所有的Unicode编码都是字符串类型
    bytes:16进制

    由于计算只认识2进制数据010101这样的数据, 但是str 存在内存中的时候就能直接显示,如果要让计算认识或者网络传输就需要把str转换为2进制

    str 转换成bytes 就叫编码

    1 通过内置函数bytes方法编码
    s = 'hi 你好'
    b = bytes(s,'utf8') #uft8规则下的类型
    2 或者通过str 的内置方法编码
    b = s.encode('utf8')


    1 bytes 转换成str 就叫解码
    str(b,'utf8')
    2 或者通过decode 解码
    b.deconde('utf8')

     


    #字符换转换成二进制 encode 或者 bytes 方法
    name = '你好'
    print(name.encode("utf8")) #等价与 bytes(name,'utf8')
    print(name.encode("gbk")) #等价与 bytes(name,'gbk')
    print(type(name.encode("gbk"))) #<class 'bytes'>


    #二进制转字符串 str 或者 decode 方法
    b = bytes(name,'utf8')
    print(str(b,'utf8')) #等价与 b.decode('utf8')


     

     
  • 相关阅读:
    BSGS
    [AT1252] IOIOI カード占い
    [十二省联考2019]春节十二响
    [CF912E] Prime Gift
    CDQ分治
    [CF747F] Igor and Interesting Numbers
    [十二省联考2019]异或粽子
    51Nod 2128 前缀异或
    51Nod 3212 数字变位
    HDU 1106 排序
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9075452.html
Copyright © 2011-2022 走看看