Python 字符串编解码研究


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

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

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

  1. 代码中字符串的默认编码与代码文件本身的编码一致。
    举个例子,如果是在utf8的文件中,那么字符串就是utf8编码;如果是在gb2312的文件中,则其编码为gb2312。 但是,如果指明了字符串为unicode字符串,那么就是unicode编码。
  2. 代码文件的默认编码与系统编码一致,因此如果不指定文件的编码,那么默认的编码格式就是系统编码。 那么如何查看系统编码?
    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 "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys) #需要reload。
<module 'sys' (built-in)>
>>> 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向PHP发起GET与POST请求

《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]

《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码]

Python脚本获取Linux系统信息

在Ubuntu下用Python搭建桌面算法交易研究环境

Python 语言的发展简史

Python 的详细介绍:请点这里
Python 的下载地址:请点这里

本文永久更新链接地址:

相关内容