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=<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=
        s1的内容是'hello',当它采用base64编码后,s2内容为'aGVsbG8='。s1到s2的过程称为编码,s2到s1的过程称为解码。
        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)
        源码的编码格式为utf-8,所以s1的编码格式为utf-8。若要想将格式转换为gb2312,则必须先解码(decode)成系统缺省编码,然后再编码(encode)成gb2312。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值