0
点赞
收藏
分享

微信扫一扫

Python 编码格式深入学习


在代码编写或者爬虫抓包的时候,经常出现编码的错误,如何避免呢?

  1. 首先在 py 文件头部指定文件内容编码:
    例如:如下三种方式都可以,建议使用第一种 # -​- coding: utf-8 -​-
# -*- coding: utf-8 -*-  
# coding=utf-8
# vim: set fileencoding=utf-8:

  1. 文件保存的时候要和py文件头部编码一致
  2. 在用decode和encode的时候,一定要确认要转换的字符原编码是什么。
    例如:
    网页中都会指定编码(),
    你在抓取这个网站并获取它的html后进行编码转化就要注意了:

import urllib2
html = urllib2.urlopen(url)
html = html.decode(‘gb2312′)

一、系统编码接口

Python获取系统编码参数的几个函数:

系统的缺省编码(一般就是utf-8): sys.getdefaultencoding() 
系统当前的编码: locale.getdefaultlocale()
系统代码中临时被更改的编码(通过locale.setlocale(locale.LC_ALL,“zh_CN.UTF-8″)):locale.getlocale()
文件系统的编码: sys.getfilesystemencoding()
终端的输入编码: sys.stdin.encoding
终端的输出编码: sys.stdout.encoding
代码的缺省编码: 文件头上# -*- coding: utf-8 –*-

实例如下:
import sys, locale

print('系统的缺省编码: '+ sys.getdefaultencoding() )
print('终端的输入编码: '+ sys.stdin.encoding )
print('终端的输出编码: '+ sys.stdout.encoding )
print('文件系统缺省编码: '+sys.getfilesystemencoding() )

print('临时修改系统当前的编码: '+ locale.setlocale(locale.LC_ALL,'zh_CN.UTF-8') )
print('获得临时修改后的系统编码: '+ str( locale.getlocale()) )

输出解结果为:
PS C:\Users\Administrator\Desktop\tmp> python .\Untitled-3.py
系统的缺省编码: utf-8
终端的输入编码: utf-8
终端的输出编码: utf-8
文件系统缺省编码: utf-8
临时修改系统当前的编码: zh_CN.UTF-8
获得临时修改后的系统编码: ('zh_CN', 'UTF-8')

某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。

因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:codecs.BOM_UTF8

二、常用字符编码

编码

制定时间

作用

所占字节数

ASCII

1967年

表示英语及西欧语言

8bit / 1Bytes

GB2312

1980年

国家简体中文字符集,兼容 ASCII

16bit / 2Bytes

Unicode

1991年

国际标准组织统一标准字符集

16bit / 2Bytes

GBK

1995年

GB2312的扩展字符集,支持繁体字,兼容GB2312

16bit / 2Bytes

UTF-8

1992年

不定长编码

1Bytes - 3Bytes



ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)
是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,后128个称为扩展ASCII码。Python 编码格式深入学习_javascript



GBK 和 GB2312
对于我们来说能在计算机中显示中文字符是至关重要的,然而ASCII表里连一个偏旁部首也没有。所以我们还需要一张关于中文和数字对应的关系表。一个字节只能最多表示256个字符,要处理中文显然一个字节是不够的,所以我们需要采用两个字节来表示,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。



Unicode
但如以来,就会出现一个问题,各个国家都一套自己的编码,就不可避免会有冲突,这是该怎么办呢?
因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

ASCII编码是1个字节,而Unicode编码通常是2个字节。
字母A用ASCII编码是十进制的65,二进制的01000001;
字母A用Unicode编码是十进制的65,二进制的00000000 01000001;
如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。



UTF-8
基于节约的原则,出现了把Unicode编码化为“可变长编码”的UTF-8编码。
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间了。
Python 编码格式深入学习_ico_02
从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。




举报

相关推荐

0 条评论