1、python2中默认ASCII编码,读取汉字会报错
解决:
- 在字符串前加u,将其指定为utf-8编码,如print u'我爱你中国'
- 在程序开头加 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 注意:=两边不要空格
- 更改 sys.defaultencoding 为文件的编码方式
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
2、python3 源码文件默认使用utf-8编码吗,所以可以正常解析中文,无需指定utf-8编码
3、编码转换
在python中,编码解码其实是不同编码系统间的转换,默认情况下,转换目标是Unicode,即编码unicode→str,解码str→unicode,其中str指的是字节流,而str.decode是将字节流str按给定的解码方式解码,并转换成utf-8形式,u.encode是将unicode类按给定的编码方式转换成字节流str。注意调用encode方法的是unicode对象,生成的是字节流;调用decode方法的是str对象(字节流),生成的是unicode对象。若str对象调用encode会默认先按系统默认编码方式decode成unicode对象再encode,忽视了中间默认的decode往往导致报错。
比如有如下代码:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中文字符' # 这里的 str 是 str 类型的,而不是 unicode
s.encode('gb2312')
这句代码将 s 重新编码为 gb2312 的格式,即进行 unicode -> str 的转换。因为 s 本身就是 str 类型的,因此
Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb2312。因为解码是python自动进行的,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding为ANSCII,如果 s 不是这个类型就会出错。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position
0: ordinal not in range(128)
对于这种情况,我们有两种方法来改正错误:
1. 明确的指示出 s 的编码方式
#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中文字符'
s.decode('utf-8').encode('gb2312')
2. 更改 sys.defaultencoding 为文件的编码方式
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys) # Python2.5 初始化后删除了 sys.setdefaultencoding 方法,我们需要重新载入
sys.setdefaultencoding('utf-8')
str = '中文字符'
str.encode('gb2312')
-
指定的编码字符只能用指定的编码方式解码,否则会报错。所有字符集中python的中间字符集是unicode。即如果gbk想转换为utf-8的路径不是直接转换,而是gbk->unicode->utf-8.不能直接gbk->utf-8
s='我爱你中国'
s.decode('gbk').encode('utf-8')
注意:另外对于一些包含特殊字符的编码,直接解码可能会报错,可以使用对于的参数来设置。如
s.decode('utf-8',ignore)忽略其中有异常的编码,仅显示有效的编码
s.decode('utf-8',replace)替换其中异常的编码为?,这个相对来可能一眼就知道那些字符编码出问题了。
总结:
1. 当取回来的数据与你当前脚本中声明的编码不一致时就要做编码转换
2.在编码转换时首先要将该数据以自身编码的格式换成unicode码(解码),再将这个unicode按utf8编码
3.为什么我的浏览器会传回gb2312的编码数据到服务器,这应该和客户端的系统编码有关系
参考:
[1] http://www.runoob.com/python/python-chinese-encoding.html
[2] https://blog.csdn.net/crazyhacking/article/details/39375535