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

本章参考自: 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
  1. ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)
    是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646
    由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,后128个称为扩展ASCII码。在这里插入图片描述

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

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

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

  4. 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

三、

本文参考自:

扫描二维码关注公众号,回复: 5391787 查看本文章

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

猜你喜欢

转载自blog.csdn.net/Ciellee/article/details/87965531