python 字符串 编码 解码_Python 字符串编解码研究

Python 2.X 在输入汉字和特殊字符的时候,经常遇到编码解码的问题,究其原因,编译器默认将文件当做ascii编码,因此要正确的实现编解码的转换,需要进行一些设置。

首先让我们来了解几个概念。

文件编码、字符串编码、系统编码

代码中字符串的默认编码与代码文件本身的编码一致。

举个例子,如果是在utf8的文件中,那么字符串就是utf8编码;如果是在gb2312的文件中,则其编码为gb2312。 但是,如果指明了字符串为unicode字符串,那么就是unicode编码。

代码文件的默认编码与系统编码一致,因此如果不指定文件的编码,那么默认的编码格式就是系统编码。 那么如何查看系统编码?

env |grep -i lang

或者,在交互式python命令行下,执行如下命令:

import sys

sys.getdefaultencoding()

输出一般都是ascii,系统编码一般是utf8,所以需要先把二者统一。

如何设置编码

方法1

在python文件开头加上# –– coding: utf-8 –– 来识别中文并能够把中文正确的转换为unicode。

方法2

修改python的默认系统编码

>>> import sys,locale

>>> sys.getdefaultencoding()

'ascii'

>>> sys.setdefaultencoding() #这里会报错,找不到setdefaultencoding()函数

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'setdefaultencoding'

>>> reload(sys) #需要reload。

>>> locale.getdefaultlocale()

('zh_CN', 'UTF-8')

>>> sys.setdefaultencoding("UTF-8") #把编码与操作系统统一起来

>>> sys.getdefaultencoding()

'UTF-8'

之所以要reload(sys),因为python环境在初始化的时候要执行site.py这个文件,而为了防止用户修改python的默认编码,在site.py文件中会把setdefaultencoding()函数del 掉,因此我们必须通过reload(sys)把这个函数找回来。 有兴趣的不妨自己试一下:

先rpm -qa|grep python26 找到python的包

然后rpm -q -l python26-2.6.8-1.el5|grep site.py 找到site.py文件的位置

我的机器上是:/usr/lib64/python2.6/site.py

vi打开,main函数里面,有一段:

if ENABLE_USER_SITE:

execusercustomize()

# Remove sys.setdefaultencoding() so that users cannot change the

# encoding after initialization. The test for presence is needed when

# this module is run as a script, because this code is executed twice.

if hasattr(sys, "setdefaultencoding"):

del sys.setdefaultencoding

重新reload一下sys,把setdefaultencoding函数给找回来。再setdefaultencoding就对了。

编码与解码

环境设置正确后,就可以进行编码转换了。python中的编码转换用decode和encode来实现,unicode编码可以认为是各种编码之间转换的桥梁。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码,因此,如果str1本身不是gb2312编码,就会报错。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码,因此,需要str2本身的编码是unicode。

总结一下,

u.encode(‘…’)基本上总是能成功的,只要你填写了正确的目标编码。这就像任何文件都可以压缩成zip文件,是一个道理。

s.decode(‘…’)经常会出错,因为s是什么“编码”取决于上下文,当你解码的时候需要确保s是用什编码。就像打开zip文件的时候,你要确保它确实是zip文件,而不仅仅是伪造了扩展名的zip文件。

Python3中,已经默认采用utf8编码了。

Python 的详细介绍:请点这里

Python 的下载地址:请点这里

logo.gif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值