在代码编写或者爬虫抓包的时候,经常出现编码的错误,如何避免呢?
- 首先在 py 文件头部指定文件内容编码:
例如:如下三种方式都可以,建议使用第一种 # -- coding: utf-8 --
# -*- coding: utf-8 -*-
# coding=utf-8
# vim: set fileencoding=utf-8:
- 文件保存的时候要和py文件头部编码一致
- 在用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
本章参考自: http://www.cnblogs.com/walkerwang/archive/2011/08/03/2126373.html
二、常用字符编码
编码 | 制定时间 | 作用 | 所占字节数 |
---|---|---|---|
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码。 -
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编码就能节省空间了。
从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
本章参考自: http://www.cnblogs.com/schut/p/8406897.html
详细原理可以自行参考下: https://www.cnblogs.com/finallyliuyu/archive/2013/05/10/3071023.html
三、
本文参考自:
https://www.cnblogs.com/schut/p/8407258.html
http://www.cnblogs.com/schut/p/8406897.html
https://www.cnblogs.com/laogaoyang/p/5715671.html
https://www.cnblogs.com/zhangqigao/p/6496172.html