关于编码的笔记

(根据【金角大王alex】博客整理)

编码概述:

首先来看一下不同的编码方式:

  • ASCII 占1个字节,只支持英文
  • GB2312 占2个字节,支持6700+汉字
  • GBK GB2312的升级版,支持21000+汉字
  • Shift-JIS 日本字符
  • ks_c_5601-1987 韩国编码
  • TIS-620 泰国编码

  由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其它国家字符的对应关系。应运而生出现了万国码(Unicode),它涵盖了全球所有的文字和二进制的对应关系:

Unicode:

  • Unicode 2-4字节已经收录了136690个字符,目前还在不断扩张中...

Unicode有两个作用:

  1. 直接支持全球所有语言,每个国家都可以不再使用自己之前的就编码了(类似于英语是全球的通用语言)

  2. unicode包含了和全球所有国家编码的映射关系。

  Unicode虽然解决了字符和二进制之间的关系,但是使用Unicode存储一个字符太浪费内存空间了,例如使用ASCII存储“Python”字符串仅仅需要6个字节,但是使用unicode则需要十二个字节。

  使用Unicode编码在硬盘或者内存上存储空间过大的问题还是个小事情,但是在进行网络传输上则存在较大的问题,以"Python"这个字符串为例,使用Unicode相比ASCII则需要多传一倍的内容,但是本质上传输的内容还是相同的。

  为了解决存储空间过大和网络传输增加带宽的问题,出现了Unicode Transformation Format(即UTF),它的作用是对unicode进行转换,以便于在存储和网络传输时可以节省空间。

UTF:

  • utf-8:是通用1、2、3、4个字节表示所有字符;优先使用1个字节,无法满足则增加一个字节,最多4个字节。
    • 英文:1个字节
    • 欧洲语系:2个字节
    • 东亚:3个字节
    • 其它及特殊字符:4个字节
  • utf-16:使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
  • utf-32:使用4个字节表示所有字符。

  UTF是为unicode编码设计的一种在存储和传输时节省空间的编码方案。

字符在硬盘上的存储:

无论字符以什么编码在内存里显示,存到硬盘上都是2进制。

存储到硬盘上时以何种编码存的,再从硬盘上读出来,就必须以何种编码读,不然就会出现乱码。

编码的转换:

unicode其中的一个功能是其包含了和全球所有国家编码的映射关系,换一句话说,就是使用gbk编码的“刘十一”,unicode能自动知道它在unicode中的“刘十一”的编码是什么。

 

 在python2中,python文件默认的以ascii格式进行编码:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

在python3中, python文件默认以utf-8方式进行编码:

 liushiyi@bizhehaodeMacBook-Air  ~  python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

Python3的执行过程:

  1. 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode;

  2. 把代码字符串按照语法规则进行解释;

  3. 所有的变量字符都会以unicode编码进行声明。

posted @ 2017-12-25 13:40  刘十一  阅读(453)  评论(0编辑  收藏  举报