jamchen

导航

 

编码

python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...

认识常见编码

  GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码

  GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名

  cp936:中文本地系统是Windows中的cmd,默认codepage是CP936,cp936就是指系统里第936号编码格式,即GB2312的编码。

    (当然有其它编码格式:cp950 繁体中文、cp932 日语、cp1250 中欧语言。。。)

  Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

  UTF-8 (8-bit Unicode Transformation Format)是最流行的一种对 Unicode 进行传播和存储的编码方式。它用不同的 bytes 来表示每一个代码点。ASCII 字符每个只需要用一个 byte ,与 ASCII 的编码是一样的。所以说 ASCII 是 UTF-8 的一个子集。

 

在开发Python程序的过程中,会涉及到三个方面的编码:

  • Python程序文件的编码
  • Python程序运行时环境(IDE)的编码
  • Python程序读取外部文件、网页的编码

python程序文件的编码

例如:

Python2自带的IDE,当创建了一个文件保存的时候提示:

这是因为Python2编辑器默认的编码是ASCII,它是无法识别中文的,所以会弹出这样的提示。这也是我们在大多情况下写python2程序的时候习惯在程序的第一行加上:#coding=utf-8

python3中的编码支持中文编码,默认为'utf-8'格式编码。所以写程序的时候不需要添加#coding=utf-8

Python程序运行时环境(IDE)的编码

情景一、在windows cmd下执行:

Windows cmd 用的是cp936,也就是中文的GB2312,在GBK的字符集里没有“©”,这就导致通过GBK解析的时候出现编码问题。

例如通过subprocess模块获取cmd执行后返回的执行结果,不能正常编译

import subprocess
obj = subprocess.check_output('ipconfig')
print(obj)

返回的结果是中文的GB2312,是字节码形式:

 将其进行编码为字符串:

有两种方式

1.obj.decode('gb2312')

2.str(obj,encoding='gb2312')

如果将其编码为‘utf-8’则会报错,将其编码为utf-8格式,

str(obj.decode('gb2312').encode('utf-8'),encoding = 'utf-8')

Python程序读取外部文件、网页的编码

在使用爬虫抓取网页的时候,很多网页都是GBK,在显示的时候就会乱码,可以获取网页的编码是什么格式,然后转换成 Unicode 编码,在encode解码成其他编码

 

decode()与encode()

 

  例子:

>>> str1 = 'asfsd'
>>> str1.encode('utf-8')

输出结果:b'asfsd'   #将字符串编码为unicode码

>>> str1.encode('utf-8').decode('gb2312')

输出结果为:'asfsd' #将中间码unicode解码为gb2312的字符串

 

方法2:.

>>> str1 = 'asdfag'

str(bytes(str1,encoding=('utf-8')),encoding = 'gb2312')

 

 

注:字节没有encode,字符串没有decode

>>> str1.decode('utf-8')

AttributeError: 'str' object has no attribute 'decode'

posted on 2017-03-10 10:17  jamchen  阅读(167)  评论(0)    收藏  举报