Chinaunix首页 | 论坛 | 博客
  • 博客访问: 690253
  • 博文数量: 214
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:02
文章分类

全部博文(214)

文章存档

2008年(43)

2007年(171)

我的朋友

分类:

2008-02-24 10:50:49

关于UNICODE:

除掉gb18030、big5、iso8859等等这些native language system(NLS)以外,目前有两个致力于统一全球编码的体系存在:unicode和iso10646,这两个体系刚开始时是独立建立的,但后来达成协议互相兼容,因此基本上可以等同。由于unicode这个名字更好记,被使用的更广泛一些。

unicode是一整套系统、包含字符集、编码、字型等等许许多多的规范。而我们平时说的unicode,狭义上一般是指字符集的概念。字符集与编码不同,仅仅描述在此系统中存在哪些字符,并进行分类,并不涉及到如何用数字编码表示的问题。这也正是limodou所说"虚拟编码"的含义。但我们要想在计算机上表示字符,必然要用到编码方式,这也是大家容易混淆的地方。

关于UCS:

UCS(Universal Character Set)是ISO-10646定义的字符集,也定义了数种编码方式,最常用的是UCS-2和UCS-4。

UCS-2:
使用0-65535之间的数表示一个unicode字符。UCS-2无法表示所有的unicode字符,只能表示其前65536个字符(称为Basic Multilingual Plane,BMP)。

UCS-4:
使用0-FFFFFFFF之间的数表示一个unicode字符,但为了和unicode体系兼容(unicode体系是一个20bit系统),ISO-10646表示所有定义的字符将不超过10FFFF。UCS-4可以表示所有的unicode字符。

UTF-8:
一种变长unicode编码方式,使用1到4个字节表示一个unicode字符。与ascii字符集等同的unicode子集使用一个字节表示,拉丁字符、希腊字符等一些西方字符使用两个字节表示,BMP中的其他字符使用三个字节表示(包括汉字),BMP之外的字符使用四个字节表示(包括一些罕见汉字)。

UTF-16:
一种变长unicode编码方式,使用两个或者四个字节表示一个unicode字符。BMP字符的表示方式等同于UCS-2,其他的字符使用四个字节表示。为解决endianness问题,UTF-16定义了三种具体实现方式:UTF-16、UTF-16LE、UTF-16BE。其中的UTF-16使用BOM(Byte Order Mark)表示endianness。


Python中的unicode:

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都有自己的编码,比如中文windows2000的cmd命令行,其编码为GB18030(或者GBK?记不请了)。在linux下,通过环境变量LANG可以指定。所有对unicode的序列化操作(比如print),都将以该编码处理。


wxPython中的unicode:

wxPython分为unicode和ansi两个版本。wxPython是图形界面库,其版本只针对图形界面而言,其他部分的操作仍然按照python的方式。unicode版本中,所有返回的界面字符串均是以unicode对象来表示,而ansi版本则是以string对象来表示,其编码方式为操作系统默认编码。

比如你在一个文本框中敲入"中文"二字,self.textbox.GetValue()在unicode版本返回u"中文",在ansi版本则返回GB18030编码的"中文"。

阅读(984) | 评论(0) | 转发(0) |
0

上一篇:xmlns的作用

下一篇:UNIX终端色彩控制

给主人留下些什么吧!~~