python2编码总结(转)
以下依次列出python2常遇到的几个问题及讲解。
# -*- coding:utf-8 -*-
python2默认以ASCII编码,但是在实际编码过程中,我们会用到很多中文,为了不使包含中文的程序报错,也是为了符合国际通用惯例,一般将我们的文件编码设置为utf-8格式。
设定编码的格式有很多种,只要第一行或者第二行的声明符合正则表达式 "coding[:=]\s*([-\w.]+)" 即可,一般的声明方式为#-*- coding:utf-8 -*-。
str = "你好"
print str
运行以上代码,程序会报错:SyntaxError: Non-ASCII character '\xe4' in file D:/TestPython/test/111.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details。这是提示程序中有非ASCII编码的字符。如果加上utf-8声明,程序就不会报错。
# -*- coding:utf-8 -*- str = "你好"
print str
虽然以上写法不会报错,但是输出的却是乱码,为什么呢?这就是下面要讲的内容。
encode和decode
讲解编码和解码之前,先来讲讲Unicode和utf-8的关系,推荐这篇博客给大家。
# -*- coding:utf-8 -*- str1 = "你好"
print type(str1)
str2 = str1.decode("utf-8")
print type(str2)
str1是str类型, 通过decode转为了unicode类型。
下面看encode代码:
# -*- coding:utf-8 -*- str1 = u"你好"
print type(str1)
str2 = str1.encode("utf-8")
print type(str2)
str1是unicode类型,通过encode转为了str类型。
我们再回头看最开始留下的问题,那段代码为什么会输出乱码呢。因为文件规定的编码格式是utf-8,但是我们print是打印到控制台的,控制台无法显示utf-8编码格式的字符。所以我们要转一下格式。
# -*- coding:utf-8 -*- str = "你好"
str = str.decode("utf-8")
print str
很多时候编码解码的时候需要加ignore参数才能正确转换,例如.encode('utf-8', 'ignore')或.decode('utf-8', 'ignore'),大家自行斟酌吧。
chardet获取编码格式
有些时候我们是无法知道字符串是什么编码的,比如抓取网页时,有些是utf-8的,有些是gb2312编码的,那我们该怎么获取编码格式并转换为unicode呢。这里就介绍到一个第三方库chardet。使用方式大概如下:
# -*- coding: utf-8 -*- import chardet str = "xxxxx"
str_type = chardet.detect(str)
code = str_type['encoding']
code即为str的编码格式。但有些人反映该方法得到的编码格式不准确,速度也慢。本人亲测,速度确实一般,但是目前还没遇到不准确的情况。大家可以斟酌使用,我这里只是提供一个思路,如果谁那里有更好的方式,可以告知小弟,不吝赐教才是。
import sys
reload(sys)
sys.setdefaultencoding('utf8')
之前也遇到过很莫名其妙的编码错误,网上搜到这种方法能解决就糊里糊涂的用上了,也不知是什么原理。今天看到一篇不错的博客,推荐给大家:http://blog.csdn.net/crazyhacking/article/details/39375535。以下内容引用自该篇文章:
Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。编码是 unicode -> str,相反的,解码就是 str -> unicode。剩下的问题就是确定何时需要进行编码或者解码了.关于文件开头的"编码指示",也就是 # -*- coding: -*- 这个语句。Python 默认脚本文件都是 UTF-8 编码的,当文件中有非 UTF-8 编码范围内的字符的时候就要使用"编码指示"来修正. 关于 sys.defaultencoding,这个在解码没有明确指明解码方式的时候使用。比如我有如下代码:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中文' # 注意这里的 str 是 str 类型的,而不是 unicode
s.encode('gb18030') 这句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。因为 s 本身就是 str 类型的,因此 Python 会自动的先将 s 解码为 unicode ,然后再编码成 gb18030。因为解码是python自动进行的,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是 ANSCII,如果 s 不是这个类型就会出错。拿上面的情况来说,我的 sys.defaultencoding 是 anscii,而 s 的编码方式和文件的编码方式一致,是 utf8 的,所以出错了:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position
0: ordinal not in range(128)
对于这种情况,我们有两种方法来改正错误:
一是明确的指示出 s 的编码方式 #! /usr/bin/env python
# -*- coding: utf-8 -*- s = '中文'
s.decode('utf-8').encode('gb18030') 二是更改 sys.defaultencoding 为文件的编码方式 #! /usr/bin/env python
# -*- coding: utf-8 -*- import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8') str = '中文'
str.encode('gb18030') 看完之后,改成这样 print "<p>addr:", form["addr"].value.decode('gb2312').encode('utf-8')
成功通过.
但是这种方式用着就是别扭,还是尽量自己来控制编码,明确了编码格式,自己写着也踏实。
个人总结
实际编程过程中,最好能在代码内统一编码格式,比如统一为unicode,因为这样就不用考虑编码的问题了。到了显示或输出时再转换为存储类型(utf-8、GBK)。
以上为最近编写python代码的过程中遇到的一些问题及总结,如果有什么不对的地方还请大家及时回复交流,在此谢过。
http://www.cnblogs.com/jinhaolin/p/5128973.html
python2编码总结(转)的更多相关文章
- [python]Python2编码问题
以下内容说的都是 python 2.x 版本 简介 基本概念 Python "帮"你做的事情 推荐姿势 基本概念 我们看到的输入输出都是'字符'(characters),计算机(程 ...
- python2编码问题
前言:python3解决了编码的问题,但python2还存在很多编码问题,用P2写爬虫爬了网页,解析时常有不同字符混着编码,导致解码问题成为爬虫程序员的噩梦... 但咱们要用robot framewo ...
- Python2 编码问题分析
本文浅显易懂,绿色纯天然,手工制作,请放心阅读. 编码问题是一个很大很杂的话题,要向彻底的讲明白可以写一本书了.导致乱码的原因很多,系统平台.编程语言.多国语言.软件程序支持.用户选择等都可能导致无法 ...
- python2编码的问题
1,python2的默认编码是ascii码. 2,python2中有2中数据模型来支持字符串这种数据类型,分别为str和unicode. 3,uncode转换为其他编码是encode,其他编码转换成u ...
- python3和python2编码拾遗
py2编码 tr和unicode str和unicode都是basestring的子类.严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列.对UTF-8编码的str'苑'使 ...
- python2 编码问题详解
实例对比 定义 type str unicode print encode('utf8') decode('utf8') encode('unicode-escape') encode('string ...
- python2 编码与解码
#!coding: utf-8 s = "特斯拉" s_to_unicode = s.decode("utf-8") unicode_to_gbk = s_to ...
- 转 PYTHON2 编码处理-str与Unicode的区别
https://www.cnblogs.com/long2015/p/4090824.html
- 从python2,python3编码问题引伸出的通用编码原理解释
今天使用python2编码时遇到这样一条异常UnicodeDecodeError: ‘ascii’ code can’t decode byte 0xef 发现是编码问题,但是平常在python3中几 ...
随机推荐
- VC中Tab control的用法
1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置I ...
- 工厂方法模式(factory method pattern)
工厂方法模式相对于简单工厂模式的长处是为了更好的拓展,当假设再新加一种产品,对于简单工厂模式来说须要改动核心的工厂类,但对于工厂方法模式则不须要,在工厂方法模式中核心的工厂类不再负责创建全部产品的创建 ...
- 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁
上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和基本的方法,显示了怎样 ...
- OpenCV两张图片的合并
转载请注明出处..! http://blog.csdn.net/zhonghuan1992 OpenCV两张图片的合并 原理: 两张图片合并,想想图片是用一个个像素点来存储.每一个像素点有他的值. 那 ...
- JavaScript采用append添加的元素错误
1.错误叙述性说明 于IE览器上: Uncaught HierarchyRequestError:Failed to excute 'appendChild' on 'Node':The new ch ...
- lightoj1038(期望dp)
给定一个数字d,随机选择一个d的约数,然后让d除以这个约数,形成新的d,不断继续这个步骤,知道d=1为止, 要我们求将d变为1的期望次数 设d1,d2...dj是除以约数后,形成的行的d,且dj==d ...
- 怎么样excel其产生的条形码(10分钟的时间excel)从而出现了条形码
现在快递行业.京东购物,这样一来,使用条码管理,因此,如何在你的excel其中还生产商品条码管理它?其实很easy,4步骤学会!10分钟搞定. 1.从网址如下.下载字体, 2.双击安装字体. 3,在e ...
- C++ - Identifier not found
This is because forward declaration in C++: Compiler needs to know function prototype when functi ...
- javascript获取当前url中的參数
javascript获取当前页面url中的參数能够使用location的search方法,获取到的是url中?后面的部分,比如http:localhost:8080/Manager/index.jsp ...
- JAVA: httpclient 具体解释——第五章;
httpclient 具体解释--第一章: httpclient 具体解释--第二章: httpclient 具体解释--第三章: httpclient 具体解释--第四章: httpclient 具 ...