【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。
        一、在存入磁盘时,须要将unicode转成一种更为精准的格式,utf-8:全称Unicode Transformation Format,将数据量控制到最精简
        二、在读入内存时,须要将utf-8转成unicode
    因此咱们须要明确:内存中用unicode是为了兼容万国软件,即使是硬盘中有各国编码编写的软件,unicode也有相对应的映射关系,但在如今的开
    发中,程序员广泛使用utf-8编码了,估计在未来的某一天等全部老的软件都淘汰掉了状况下,就能够变成:内存utf-8<->硬盘utf-8的形式了。

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

相关文章
相关标签/搜索