python中unicode、utf8、gbk等编码问题
转自:http://luchanghong.com/python/2012/07/06/python-encoding-with-unicode-and-gbk-and-utf8.html
前一段时间就想写一篇总结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等编码问题的更多相关文章
- Unicode/UTF-8/GBK/ASCII 编码简介
转载:http://blog.csdn.net/u014785687/article/details/73928167 一.字符编码简介 1.ASCII编码 每一个ASCII码与一个8位(bit)二进 ...
- python中unicode utf-8的互换
比较简单明了,直接上例子 # -*- coding: utf-8 -*- t0 = u'测试' #u'\u6d4b\u8bd5' t1 = '测试' #'\xe6\xb5\x8b\xe8\xaf\x9 ...
- 如何在Python 中使用UTF-8 编码 && Python 使用 注释,Python ,UTF-8 编码 , Python 注释
如何在Python 中使用UTF-8 编码 && Python 使用 注释,Python ,UTF-8 编码 , Python 注释 PIP $ pip install beauti ...
- 【转】Python中的字符串与字符编码
[转]Python中的字符串与字符编码 本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常 ...
- Python中Unicode字符串
Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte ...
- python中unicode和str的组合
python中unicode对象和str对象拼接在一起,会自动将str对象转换成unicode对象 即:a="aa" b=u"bb" c=a+b type(c) ...
- python中unicode, hex, bin之间的转换
python中unicode, hex, bin之间的转换 背景 在smb中有个feature change notify, 需要改动文件权限dacl,然后确认是否有收到notify.一直得不到这个d ...
- python中,ascii,unicode,utf8,gbk之间的关系梳理
在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...
- 字符编码详解及由来(UNICODE,UTF-8,GBK)[转帖]
相信許多人對字符編碼都不是很了解,透過下文可以清晰的理解各种字符编码方式详解及由来. 一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS ...
随机推荐
- sqlserver之二进制和字符串sql语句
正常情况下我们对数据库的操作就是如下的写法来操作数据库 ID AS 编号,BookName AS 书名 FROM dbo.books ORDER BY ID; ; 但是在客户正在使用的数据库里,我们开 ...
- 设置win7任务栏显示标题,而不显示缩略图
win7系统的任务栏可以显示桌面缩略图,这是非常好的一个功能,但是有时候我们希望只显示标题,如下所示 怎样设置呢?只要在桌面上的计算机图标上面“右键”,选择“属性”,在弹出的窗口选择“高级系统设置”, ...
- js cookie使用方法详解
代码如下 复制代码 <script>function getCookie(c_name){ if (document.cookie.length>0){ //先查询cookie是否为 ...
- iOS开发 中的代理实现
iOS开发 中的代理实现 关于今天为什么要发这篇文字的原因:今天在和同事聊天的时候他跟我说项目中给他的block有时候不太能看的懂,让我尽量用代理写,好吧心累了,那就先从写个代理demo,防止以后他看 ...
- display的小故事
实在是想不出来到底整个什么题目好..姑且先整这个吧.. 本文不是讲解display这个牛逼css属性的(讲不好才是真的!),主要是分享一下一些小Tips. display:table-cell wid ...
- 通过命令行连接oracle数据库/进入sql plus
1.直接打开SQL Plus登录,需要用户名和密码 开始->程序->Oracle->应用程序开发->sqlplus 我的电脑是“开始”->“Oracle - OraDb1 ...
- Unity基本操作一
1,使对象进入摄像机镜头内align with view 2,太阳光 创建点point light,调节Intensity改变光照强度,上面的Range改变光照范围. 3,Animation选中Pla ...
- ThreadPool 线程池的作用
相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
- JAVA_SE复习(异常)
异常.调试和断言 一. 异常的分类 1. 可查异常 例: 2. 不可查异常 例:Runtime Exception 3. 异常的分类结构: 1. 不执行finally 子句的唯一情况是虚拟机关 ...
- HTML5如何重塑O2O用户体验
低频次垂直O2O服务应该继续开发原生APP吗?大家有没有发现做一个APP的推广成本和获取用户的成本越来越高?第二,用户安装APP之后,用户并不是经常点击使用APP的,那这是为什么?数据表明90%的O2 ...