Python 字符串编解码分析
发布时间:2021-12-11 11:12:31 所属栏目:PHP教程 来源:互联网
导读:Python 2.X 在输入汉字和特殊字符的时候,经常遇到编码解码的问题,究其原因,编译器默认将文件当做ascii编码,因此要正确的实现编解码的转换,需要进行一些设置。 首先让我们来了解几个概念。 文件编码、字符串编码、系统编码 代码中字符串的默认编码与代码
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 "<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编码了。 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |