【Python基础】字符编码ASCII-GBK-Unicode-UTF-8之间的关系

字符编码
由于计算机只识别0和1,为了使计算机能够支持文字和字母等符号,方便实用操作计算机
于是字符编码应运而生,旨在解决符号和人类语言与计算机0和1建立起一种对应关系
据说不理解字符编码可能是程序员一辈子的遗憾,拿出来单独总结一下

发展史:
    ASCII-->Unicode-->UTF-8
    ASCII是最早期应用在美国方面的,建立了A-z和一批特殊符号,一共128种字符与二进制之间的对应关系
        比如:小写字母w   十进制135   转换为二进制  10000111
             空格        0                      0
        如果表示[空格][空格]w  二进制就是          0010000111    #前面的两个0代表两个空格
        就有个问题就是二进制本来就一串繁琐空格和w怎么话分界线来界定每个字符的界限呢,以致后来就统一了一下所有字符都占8位,每次以8位界限读取
        如果表示[空格][空格]w  二进制就是          00000000 00000000 10000111    ##这里每1或0占1bit(比特)
        于是乎就有了今天的ASCII码每个字符占1bytes(字节)
            换算关系:
                bit                 位,计算机中最小的表示单位,每个字符转二进制后的0和1
                8bit = 1bytes(B)    字节,最小的存储单位,1bytes缩写为1B
                1KB  = 1024B
                1MB  = 1024KB
                1GB  = 1024MB
                ...
        优点:建立了对应关系
        缺点:并不适用其他国家语言,其他语言解析会出现乱码,比如中文,韩文等等...

    GBK     为了同时满足中文和英文(ASCII),中国人定制了GBK,也就是说这个时候中文和英文使用GBK没问题,如果写日文其他语言就会产生乱码
            GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符
            其他国家满足自己,各个国家纷纷定制了自己的编码
            日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里

    Unicode 旨在解决其他国家语言共存的问题而应运而生,俗称万国编码,仅建立在内存中
            由于ASCII 用的是 8位也就是说  最多支持 11111111 转换成十进制255个编码
            中文恐怕就远远不够了,中文有几万个,后来对于中文就在原来1字节(11111111)基础又加了1个字节

            ASCII    英文               11111111  最高支持255个字符      占用1字节
            Unicode  支持中文  11111111 11111111  100W+                 占用2-4字节
            Unicode为了同时兼容8位的ASCII,在原来ASCII的8位基础上统一添加00000000实现了 2个bytes
            之所以说unicode是定长是因为所有的字符都是占用2bytes
            这就是unicode(定长), 统一用2Bytes代表一个字符, 虽然2**16-1=65535,
            但unicode却可以存放100w+个字符,因为unicode存放了与其他编码的映射关系,准确地说unicode并不是一种严格意义上的字符编码表

    UTF-8   很明显对于通篇都是英文的文本来说,unicode的式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)
            于是产生了UTF-8(可变长,全称Unicode Transformation Format),对英文字符只用1Bytes表示,对中文字符用3Bytes,对其他
            生僻字用更多的Bytes去存。于是现在大家也都在推行UTF-8的原因之一

整个发展历程:
    ASCII -->  GBK  -->  Unicode  -->  UTF-8
使用过程:
    基于目前的现状,内存中的编码固定就是unicode,我们唯一可变的就是硬盘的上对应的字符编码。
    此时你可能会觉得,那如果我们以后开发软时统一都用unicode编码,那么不就都统一了吗,关于统一这一点你的思路是没错的,但我们不可会使用
    unicode编码来编写程序的文件,因为在通篇都是英文的情况下,耗费的空间几乎会多出一倍,这样在软件读入内存或写入磁盘时,都会徒增IO次数,
    从而降低程序的执行效率。因而我们以后在编写程序的文件时应该统一使用一个更为精准的字符编码utf-8(用1Bytes存英文,3Bytes存中文),
    再次强调,内存中的编码固定使用unicode。
        1、在存入磁盘时,需要将unicode转成一种更为精准的格式,utf-8:全称Unicode Transformation Format,将数据量控制到最精简
        2、在读入内存时,需要将utf-8转成unicode
    所以我们需要明确:内存中用unicode是为了兼容万国软件,即便是硬盘中有各国编码编写的软件,unicode也有相对应的映射关系,但在现在的开
    发中,程序员普遍使用utf-8编码了,估计在将来的某一天等所有老的软件都淘汰掉了情况下,就可以变成:内存utf-8<->硬盘utf-8的形式了。

参考:http://www.cnblogs.com/linhaifeng/articles/5950339.html
更多图文并茂请点超链接

猜你喜欢

转载自blog.51cto.com/swiki/2129947
今日推荐