Python的字符串编码规则
Python的字符串编码规则
Python的字符串编码规则一直让我很头疼,花了点时间研究了下,并不复杂。主要涉及的内容有:文件的编码格式、系统缺省的编码格式、字符串的编码转换。
本文并不研究具体的编码格式,相关内容可以谷歌。
文件编码
所谓文件编码指的是Python源码的编码格式,一般用notepad++能看到源码文件的编码。源码文件的格式会影响到在源码中定义的字符串,假设源码的编码格式为utf-8,那么下面定义的字符串的编码格式就是utf-8。s = '你好'为了方便后文对字符串的分析,特别定义了一下两个函数。
import chardet def toHexString(s): return ":".join("{0:x}".format(ord(c)) for c in s) def getCharset(s): return chardet.detect(s)['encoding']有了这两个函数,就可以查到字符串中的具体内容和字符串的编码格式。(此处需要用到chardet库) 文件的编码格式可以源码中声明,相关文档参见:PEP 0263 -- Defining Python Source Code Encodings。你可以在文件的第一或者第二行,用下面三种方式之一定义文件的编码格式,以便让Python解析器正确的解析。
# coding=
#!/usr/bin/python # -*- coding:-*-
#!/usr/bin/python # vim: set fileencoding=若未指定源码的编码格式,默认是ascii,Python支持的编码格式名称参见这里。注意的是,类似utf_8和uft-8是一样的名称。 实际的使用中,若源码格式是utf-8,则不需要指定,上面定义的字符串就是utf-8格式的。若文件格式是ANSI,则需要采用如下定义才能正常使用上面的变量s的定义,而且s中的格式为gb2312。:
#coding=gb2312
系统的缺省编码
系统的缺省编码可以通过如下方式获取,默认的是ascii。它会影响到后文提到的字符串之间的转码的理解,注意只是便于理解。import sys sys.getdefaultencoding()关于该函数的说明可以参加这里。
编码转换
先看下什么是编码,什么是解码。假设有如下脚本:import base64 s1 = 'hello' print s1 s2 = base64.b64encode(s1) print s2 # out: aGVsbG8=s1的内容是'hello',当它采用base64编码后,s2内容为'aGVsbG8='。s1到s2的过程称为编码,s2到s1的过程称为解码。 Python中字符串的编码格式之间转换的概念和上面类似。对于字符串,提供了两个函数:str.encode和str.decode。这两个函数都是和系统缺省编码之间的转换,encode是系统缺省编码转换为指定的编码,而decode是指定的编码转换为系统的编码。参见下面的例子:
#coding=utf-8 import chardet def toHexString(s): return ":".join("{0:x}".format(ord(c)) for c in s) def getCharset(s): return chardet.detect(s)['encoding'] s = '你好' print getCharset(s) s1 = s.decode('utf-8').encode('gb2312') print getCharset(s1)源码的编码格式为utf-8,所以s1的编码格式为utf-8。若要想将格式转换为gb2312,则必须先解码(decode)成系统缺省编码,然后再编码(encode)成gb2312。
评论关闭