2007-06-26

 

Python Cookbook 1.21 在Unicode和纯文本间转换

需求:

需要处理文本,里面包含非Ascii字符集的字符.

讨论:

unicode字符可以以多种形式编码,你可以选则自己需要的方式:

unicodestring = u"Hello world"
# Convert Unicode to plain Python string: "encode"
utf8string = unicodestring.encode("utf-8")
asciistring = unicodestring.encode("ascii")
isostring = unicodestring.encode("ISO-8859-1")
utf16string = unicodestring.encode("utf-16")
# Convert plain Python string to Unicode: "decode"
plainstring1 = unicode(utf8string, "utf-8")
plainstring2 = unicode(asciistring, "ascii")
plainstring3 = unicode(isostring, "ISO-8859-1")
plainstring4 = unicode(utf16string, "utf-16")
assert plainstring1 == plainstring2 == plainstring3 == plainstring4

如果你在自己要处理的文本中发现了非Ascii字符,那你需要了解什么是unicode,它如何工作,以及在Python中是如何处理它们的.可以参考上一节的内容.这一节会更多的讨论这个问题.
在处理真实世界的问题的时候,你并不需要知道关于unicode的所有知识,可是理解一些概念还是没有坏处的.首先需要了解的是,字节和字符是不同的.在过去的ascii时代,字节和字符是按同样的方式对待的.一个字节可以表示256个不同的数字 ,也就是说它能表示256个不同的字符.而unicode能表示成千上万的字符,所以一个字符不能等同于一个字节了.
标准的Python字符串是字节流,而Python字符是长度为1的字符串,也就是一个字节.标准Python就是处理简单字符串和字符的.
一个Python的unicode对象能表示任意大的字符,我们可以不考虑它的内部实现.只有当涉及的方法(如文件操作的write方法,网络操作的send方法等)需要处理unicode的字节顺序时, 我们才考虑具体如何表示unicode.将unicode转换为字节流称为编码(encoding),同样的,当你从文件,网络或者面向字节的对象时,需要解码(decode)来获得字符.
将unicode对象转换为字节流有很多方法,每种方法称为一种编码.由于历史原因,不仅仅存在一种编码,而是很多种.下面是一些常见的编码:

UTF-8编码可以处理任意unicode字符,并且向下和ascii兼容,所以一个纯ascii文本文件也可以看成一个utf-8文件,因为这种良好的向下兼容性,使得utf-8成为unix平台上的主要编码格式, 而且也是xml文件的默认编码格式.utf-8的缺点就是在处理东亚字符时效率不高.

UTF-16在MS平台和Java环境下经常使用,它虽然在表示西方字符时缺乏效率,然而表示东亚字符时更有效率.有时UTF-16也被成为USC-2

ISO-8859是ascii的超集,可以处理256个不同的字符.这些字符不能处理所有的unicode字符,只能处理一些流行的字符集.如:ISO-8859-1,也被称为'Latin-1',覆盖了大部分西欧和非洲字符,除了阿拉伯(Arabic)文.ISO-8859-2,也被称为'Latin-2',包含了很多东欧字符,如匈牙利(Hungarian)文和波兰(Polish)文.ISO-8859-15,目前在欧洲很流行,和ISO-8859-1 类似,只是包含了一些欧洲货币符号.

如果你希望能编码所有的字符,那么就使用utf-8吧,在处理别的编码的时候,只需要在输入时做转换就可以了.在下一节,我们会讨论输出时应该怎样处理.

相关说明:

参考上一节和下一节.


标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?