[转]python中的字符编码

        python中的unicode是一种内置类型,用来表示unicode字符串。其使用的编码方式在编译时决定,可以选择使用UCS-2或者UCS-4表示。(在gentoo linux上,可以通过ucs2这个USE flag来控制)

 

        由于unicode是一种内置类型,对其序列化(比如存盘、通过socket发送等)时必须要先将其编码成字节序列,也即python中的string类型。编码使用unicode的encode方法,其参数为编码名称,在encodings包中定义,encodings包中的alias.py文件定义了一些编码的别称。如调用encode时未指定参数,则使用sys.getdefaultencoding()的返回值编码。该值默认为'ascii',可以在$PYTHONHOME/sitecustom.py中使用sys.setdefaultencoding()修改。

        在某些操作中会进行隐式的编码转换,比如file.write()方法可以接受string参数也可以接受unicode参数。在接受unicode参数时就会自动采用sys.getdefaultencodings()的返回值将其编码为字节序列。

 

        由于默认编码为'ascii',这种编码只能表示unicode中前128个字符,在碰到包含其他字符的unicode对象时就会发生exception。可以通过两种方式解决这个问题:
1、修改sitecustom.py,将默认编码改为可以处理更大字符集的编码,如gb18030或utf8。
2、在代码中显式使用恰当的编码调用encode,将unicode对象转为string对象,然后再进行处理。

        如果你的代码会给别人使用的话,推荐使用第二种方式,这样对方就不需要修改他的sitecustom.py了。但这种方法对程序的要求较高。

 

        将已编码的string还原成unicode:使用s.decode(encoding_type),或者unicode(s, encoding_type)。

 

        在源程序中表示unicode常量:使用u"your_string",解释器将根据源程序的编码类型(默认为iso8859-1,通过源程序文件的第一行或第二行可以指定,比如#--*-- encoding: utf8 --*--)将其转换为unicode对象。

 

        在控制台(console)上处理unicode:每一个console都有自己的编码,比如中文windowsxp的cmd命令行,其编码为GB18030。在linux下,通过环境变量LANG可以指定。所有对unicode的序列化操作(比如print),都将以该编码处理。

 

        wxPython中的unicode:

        wxPython分为unicode和ansi两个版本。wxPython是图形界面库,其版本只针对图形界面而言,其他部分的操作仍然按照python的方式。unicode版本中,所有返回的界面字符串均是以unicode对象来表示,而ansi版本则是以string对象来表示,其编码方式为操作系统默认编码。比如你在一个文本框中敲入"中文"二字,self.textbox.GetValue()在unicode版本返回u"中文",在ansi版本则返回GB18030编码的"中文"。

你可能感兴趣的:(linux,python,socket,wxPython)