设为首页 收藏本站
查看: 410|回复: 0

[经验分享] Python中的字符串编解码

[复制链接]

尚未签到

发表于 2017-5-2 11:27:02 | 显示全部楼层 |阅读模式
  unicode和str类型
  Python中字符串有两种写法,比如,如果把“中国”这一字符串赋值给变量可以这样写: 

str = '中国'
  或者

str = u'中国'
   前者定义了一个字符串,而后者则定义了一个unicode编码的字符串。
首先说一下第二种形式。在Python中,为了统一不同编码的字符串的表示,同时为简化字符串的处理,其内部提供了一种统一化的文本类型unicode,即第二种形式的字符串。unicode类型的字符串只处理文本,并把文本以unicode形式在内部存储。unicode类型的作用只用于代码内部字符串的处理,而不关心外部文本的具体格式,可以看作是文本的抽象表示。
但是实际上外界文本的不同编码格式众多。比如向一个网站提交数据,其有可能要求utf-8的编码或者gbk的编码,不同的编码类型的内容是不同的, 这就需要将我们程序内部字符串转换成可以与外界交互的编码(如:utf-8,ascii,gdb等)。通常我们使用str类型来操作。严格来讲,str并不一定是文本,它也有可能是二进制的内容,它提供的其实是字节的组合(unicode类型提供的是unicode字符即的组合),只是如果str中刚好是某种形式编码的文本,它便可以当做文本处理(print等)。
我们可以通过在Python的命令行中执行以下代码来看到两种格式的不同:
对于str:

>>> str = '中国';
>>> for c in str:
...     c
... <回车>
输出:
'\xe4'
'\xb8'
'\xad'
'\xe5'
'\x9b'
'\xbd'
 对于unicode:

>>> str = u'中国'
>>> for c in str:
...     c
... <回车>
输出:
u'\u4e2d'
u'\u56fd'
 前者输出了6行,而后者只输出了2行。这是由于两种类型对字符串的不同理解造成的。前者将字符串理解为字节的组合,由于系统默认采用utf-8编码,字符串'中国'其实是有四个字节组合而成的。后者将字符串理解为文本字符的组合,u'中国'被看做“中”和“国”两个字的unicode码组合。

编码的转换


  • unicode与str的转换

我们用encode方法来对unicode字符串编码成str字符串:

>>> unicode_str = u'中国'
>>> unicode_str
u'\u4e2d\u56fd'
>>> utf8_str = unicode.encode('utf-8');
>>> utf8_str
'\xe4\xb8\xad\xe5\x9b\xbd'
 使用decode方法将str转换成unicode:

>>> utf8_str = '中国'
>>> utf8_str
'\xe4\xb8\xad\xe5\x9b\xbd'
>>> unicode_str = utf8_str.decode('utf-8')
>>> unicode_str
u'\u4e2d\u56fd'
 在encode或者decode的时候需要手动传入编码方式来指定str字符串的编码
 


  • 不同编码的转换
  有时我们可能需要以一种编码方式从数据源中获取文本,然后以另一种编码方式保存到另外的数据源中。可以利用unicode作为中间变量进行转换:

>>> utf8_str = '中国'
>>> utf8_str
'\xe4\xb8\xad\xe5\x9b\xbd'
>>> unicode_str = utf8_str.decode('utf-8')
>>> gbk_str = unicode_str.encode('gbk')
>>> gbk_str
'\xd6\xd0\xb9\xfa'
  由于gbk使用两个字节保存汉字,所以转换后总共是四个字节。

编码检测

有时候,我么可能不知道一个字符串是什么编码,chardet工具可以帮助我们检测未知编码的字符串编码格式。
首先安装chardet,在shell中:

$ sudo easy_install chardet
  安装完就可以使用了,进入Python命令行:

>>> import chardet
>>> str = '中国'
>>> chardet.detect(str)
{'confidence': 0.7525, 'encoding': 'utf-8'}
  结果中encoding是猜测的编码,confidence是可信度,之后如何处理就看你了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372084-1-1.html 上篇帖子: Python学习--运算符与表达式 下篇帖子: 使用Python的threadpool模块例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表