博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中unicode、utf8、gbk等编码问题
阅读量:6631 次
发布时间:2019-06-25

本文共 1964 字,大约阅读时间需要 6 分钟。

转自:

 

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

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

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

1.普通字符串与unicode转换

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

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

'aaa'.decode('utf8')等同于
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: ordinal 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')长春市

转载地址:http://kawvo.baihongyu.com/

你可能感兴趣的文章
hadoop集群扩展
查看>>
操作系统诊断
查看>>
[Compose] 19. Leapfrogging types with Traversable
查看>>
Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web modules
查看>>
2015年度新增开源软件排名TOP100
查看>>
BZOJ 2456: mode(新生必做的水题)
查看>>
View State
查看>>
自旋锁spinlock解析
查看>>
【java.lang.UnsupportedClassVersionError】版本不一致出错
查看>>
JVM Debugger Memory View for IntelliJ IDEA
查看>>
html5播放mp4视频代码
查看>>
032_nginx配置文件安全下载
查看>>
Linux下tomcat修改成的80端口无法访问
查看>>
为了好好看球,学霸们用深度学习重建整个比赛3D全息图
查看>>
CentOS双机中Docker下安装Mysql并配置互为主从模式
查看>>
sql in not in 案例用 exists not exists 代替
查看>>
WEB前端资源代码:学习篇
查看>>
怎样获取Web应用程序的路径
查看>>
xcode crash 查找 EXC_BAD_ACCESS 问题根源的方法
查看>>
使用java.util.concurrent.ThreadFactory来创建线程
查看>>