Python中的字符串编解码

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是可信度,之后如何处理就看你了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值