转自:http://luchanghong.com/python/2012/07/06/python-encoding-with-unicode-and-gbk-and-utf8.html

概要:编码转换无疑是程序开发过程中常遇到而且很让人头疼的问题,一旦和数据库交互那就更麻烦了,今天来总结一下 python 中编码转换的方法。

前一段时间就想写一篇总结Python字符串的文章,但是时间较紧,而且我当时遇到的问题也不是很难,就暂搁下了,今天又被这编码折磨一番,泪奔啊……

至于unicode、utf8等编码原理以及区别等问题可以去百度百科查看,网上也有介绍,我想说的是直接的转换方法——先知其然,然后再知其所以然吧。

1.普通字符串与unicode转换

无论是什么平台什么编码格式都能转换为unicode格式。

以utf8编码方式把字符串转换为unicode:

'aaa'.decode('utf8')</pre>等同于<pre class="prettyprint">unicode('aaa', 'utf8')

把unicode字符串转换为utf8编码格式字符串:

'aaa'.decode('utf8')

注意:这样写已经表示'aaa'是一个unicode格式的字符串了,等同于

u'aaa'.decode('utf8')

如果全部是英文字符或者数字,则utf8与gbk输出结果一致,而且带不带u都一样

2.有汉字的字符串

这是中国程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的,伤不起!

把普通中午字符串转换为unicode:

'也有'.decode('gbk')

注意:此时字符串前不能加u,而且汉字编码只能写gbk或者gb2312等

把上面的结果再转成gbk

print  u'\u4e5f\u6709'.encode('gbk')

当然unicode可以转成utf8,但是要看你的终端支持什么编码了,要不然就会乱码,我用的WIN,所以就用gbk测试

如果不用print输出,直接

u'\u4e5f\u6709'.encode('gbk')

或者

u'\u4e5f\u6709'.encode('utf8')

你会看到这两个汉字在gbk和utf8编码格式下的字符,这里不多研究了(utf8汉字编码比gbk多一个字符)

下面把运行的结果输出:

>>>'aaa'.decode('utf8')
u'aaa'
>>>unicode('aaa', 'utf8')
u'aaa'
>>>'aaa'.decode('utf8')
u'aaa'
>>>u'aaa'.decode('utf8')
u'aaa'
>>>'也有'.decode('gbk')
u'\u4e5f\u6709'
>>>print u'\u4e5f\u6709'.encode('gbk')
也有
>>>u'\u4e5f\u6709'.encode('gbk')
'\xd2\xb2\xd3\xd0'
>>>u'\u4e5f\u6709'.encode('utf8')
'\xe4\xb9\x9f\xe6\x9c\x89'

说明:str()函数,有时候我们要借助它来过度转换,比如u'%E9%95%BF%E6%98%A5%E5%B8%82',这就是我下午遇到的问题,把urlencode转换的编码经过urldecode解码,结果前面多个u,此时是utf8编码,然后decode成unicode,出问题了:

>>> s = u'%E9%95%BF%E6%98%A5%E5%B8%82'
>>> import urllib
>>> urllib.unquote(s)
u'\xe9\x95\xbf\xe6\x98\xa5\xe5\xb8\x82'
>>> urllib.unquote(s).decode('utf8')
Traceback (most recent call last):
File "", line 1, in
File "D:\Python26\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordin
al not in range(128)

特别注意:utf8编码、gbk编码的原型加上u然后再转unicode是错误写法,肯定转不了,那怎样去掉u呢?str()函数也不能直接转,只好把u'%E9%95%BF%E6%98%A5%E5%B8%82'用str()处理去掉u,然后一切都OK了。

>>>urllib.unquote(str(s)).decode('utf8')
u'\u957f\u6625\u5e02'
>>>print urllib.unquote(str(s)).decode('utf8')
长春市

python中unicode、utf8、gbk等编码问题的更多相关文章

  1. Unicode/UTF-8/GBK/ASCII 编码简介

    转载:http://blog.csdn.net/u014785687/article/details/73928167 一.字符编码简介 1.ASCII编码 每一个ASCII码与一个8位(bit)二进 ...

  2. python中unicode utf-8的互换

    比较简单明了,直接上例子 # -*- coding: utf-8 -*- t0 = u'测试' #u'\u6d4b\u8bd5' t1 = '测试' #'\xe6\xb5\x8b\xe8\xaf\x9 ...

  3. 如何在Python 中使用UTF-8 编码 && Python 使用 注释,Python ,UTF-8 编码 , Python 注释

    如何在Python 中使用UTF-8 编码 && Python 使用 注释,Python ,UTF-8 编码 , Python  注释 PIP $ pip install beauti ...

  4. 【转】Python中的字符串与字符编码

    [转]Python中的字符串与字符编码 本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常 ...

  5. Python中Unicode字符串

    Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte ...

  6. python中unicode和str的组合

    python中unicode对象和str对象拼接在一起,会自动将str对象转换成unicode对象 即:a="aa" b=u"bb" c=a+b type(c) ...

  7. python中unicode, hex, bin之间的转换

    python中unicode, hex, bin之间的转换 背景 在smb中有个feature change notify, 需要改动文件权限dacl,然后确认是否有收到notify.一直得不到这个d ...

  8. python中,ascii,unicode,utf8,gbk之间的关系梳理

    在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...

  9. 字符编码详解及由来(UNICODE,UTF-8,GBK)[转帖]

    相信許多人對字符編碼都不是很了解,透過下文可以清晰的理解各种字符编码方式详解及由来. 一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS ...

随机推荐

  1. 第二篇、为UITableViewCell 高度自适应加速 缓存cell的高度

    通过NSCache缓存已经算好的行高 @interface ZHCellHeightCalculator : NSObject //系统计算高度后缓存进cache -(void)setHeight:( ...

  2. 第十三篇、Swift_Nav自定义返回按钮后或者隐藏导航栏,Pop返回手势失效的解决方法 Pop全局返回添加的方法

    边缘的pop返回手势: override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.purple ...

  3. 关于《Swift开发指南》背后的那些事

    时间轴(倒叙)2014年8月底在图灵出版社的大力支持下,全球第一本全面.系统.科学的,包含本人多年经验的呕心沥血之作<Swift开发指南>(配有同步视频课程和同步练习)全线重磅推出2014 ...

  4. spring读取加密配置信息

    描述&背景Spring框架配置数据库等连接等属性时,都是交由 PopertyPlaceholderConfigurer进行读取.properties文件的,但如果项目不允许在配置文件中明文保存 ...

  5. android 数据库的创建

    主java package com.itheima.createdatabase; import android.app.Activity; import android.content.Contex ...

  6. WinForms 小型HTML服务器

    最近教学,使用到了Apache和IIS,闲着无聊,有种想自己写个小服务器的冲动. 在网上找了半天的资料,最后终于搞定了,测试可以访问.效果图如下: 因为只是处理简单的请求,然后返回请求的页面,所以没有 ...

  7. Android:ListView之ViewHolder

    前言 在开发Android应用过程中经常要与列表展示打交道,比如Listview.在使用过程中如果不能正确的进行细节处理那么对性能还是有很大的损耗的. Listview展示内容是通过一个Adapter ...

  8. Objective-C中class、Category、Block的介绍

    @class 当定义一个类,必须为编译器提供两组消息,第一组(接口部分.h):构建类的实例的一个基本蓝图.必须指定类名,类的超类,类的实例变量和类型的列表,最后是类的方法的声明.第二组(实现部分.m) ...

  9. python del函数

    del用于list列表及字典操作,删除一个或者连续几个元素也可以删除字典指定的key   示例程序如下: >>> a = [-1, 3, 'aa', 85] # 定义一个list&g ...

  10. 《WPF程序设计指南》读书笔记——第9章 路由输入事件

    1.使用路由事件 路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件.通俗地说,路由事件会在可视树(逻辑树是其子集)上,上下routed,如果哪个节点上订阅了 ...