字符编码

一、字符编码的种类

  1. ASCII

    用一个Byte表示一个字符,1byte=8bits,包含英文、拉丁文和键盘其他字符。

  2. GBK

    中国字符编码表,2Bytes代表一个字符。

  3. Shift_Jis

    日本字符编码表

  4. Euc_kr

    韩国字符编码表

  5. Unicode

    万国码,用2Bytes代表一个字符,兼容所有字符编码。优点是字符到二进制数据的转换速度快,缺点是占用空间大。

  6. UTF-8

    Unicode的改进版,对英文字符用1Byte表示,对中文字符用3Bytes。优点是节省空间,缺点是字符到二进制数据的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示。

  • 内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)
  • 硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。

二、程序的执行

  1. python解释器此时就是一个文本编辑器。从硬盘中读取test.py的内容到内存中。python解释器会读取py文件的第一行内容,#coding:xxx,来决定以什么编码格式来读入内存。可以用sys.getdefaultencoding()查看,如果不在python文件指定编码格式,那就使用默认的。python2中默认使用ascii,python3中默认使用utf-8

  2. 读取已经加载到内存的代码(unicode编码的二进制),然后执行,执行过程中可能会开辟新的内存空间。

    内存的编码使用unicode,不代表内存中全都是unicode编码的二进制,

    在程序执行之前,内存中确实都是unicode编码的二进制,比如从文件中读取了一行x="hello",其中的x,等号,引号,地位都一样,都是普通字符而已,都是以unicode编码的二进制形式存放与内存中的

    但是程序在执行过程中,会申请内存(与程序代码所存在的内存是俩个空间),可以存放任意编码格式的数据,比如x="hello",会被python解释器识别为字符串,会申请内存空间来存放"hello",然后让x指向该内存地址,此时新申请的该内存地址保存也是unicode编码的hello,如果代码换成x="hello".encode('utf-8'),那么新申请的内存空间里存放的就是utf-8编码的字符串hello了 。

  3. 产生结果,将结果发送到终端,不同终端支持特定的字符编码。

三、encode 和 decode

  1. python2 默认ASCII码
#coding=utf-8
#Python2中默认是ASCII码,一般会加入以utf-8编程
a = '编码'                       # a是utf-8类型
b = a.decode('utf-8')       # b是Unicode类型
c = b.encode('gbk')        #c是gbk类型
d = c.decode('gbk').encode('utf-8')   #先将c转换成Unicode,再转成utf-8
print a, type(a)    # 编码 <type 'str'>
print b, type(b)    # 编码 <type 'unicode'>
print c, type(c)    # ���� <type 'str'>
print d, type(d)    # 编码 <type 'str'>
  1. Python3中默认是unicode
a = '编码'                       # a是unicode类型
b = a.encode('utf-8')       # b是utf-8类型
c = a.encode('gbk')        #c是gbk类型
print(a, type(a))    # 编码 <class 'str'>
print(b, type(b))    # b'xe7xbcx96xe7xa0x81' <class 'bytes'>
print(c, type(c))    # b'xb1xe0xc2xeb' <class 'bytes'>
原文地址:https://www.cnblogs.com/binyuanxiang/p/11535121.html