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=<encoding name>
#!/usr/bin/python
# -*- coding: <encoding name> -*-
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

        若未指定源码的编码格式,默认是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=


        Python中字符串的编码格式之间转换的概念和上面类似。对于字符串,提供了两个函数: str.encodestr.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)