|
例 9.18. russiansample.xml
<?xml version="1.0" encoding="koi8-r"?>
<preface>
<title>Предисловие</title>
</preface> 这是从一个真实的俄语 XML 文档中提取出来的示例;它就是这本书俄语翻译版的一部分。注意,编码koi8-r是在首部指定的。
这些是古代斯拉夫语的字符,就我所知,它们用来拼写俄语单词“Preface”。如果你在一个正常文本编辑器中打开这个文件,这些字符非常象乱码,因为它们使用了koi8-r编码模式进行编码,但是却以iso-8859-1编码模式进行显示。
例 9.19. 解析russiansample.xml
>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('russiansample.xml')
>>> title = xmldoc.getElementsByTagName('title')[0].firstChild.data
>>> title
u'\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435'
>>> print title
Traceback (innermost last):
File "<interactive input>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)
>>> convertedtitle = title.encode('koi8-r')
>>> convertedtitle
'\xf0\xd2\xc5\xc4\xc9\xd3\xcc\xcf\xd7\xc9\xc5'
>>> print convertedtitle
Предисловие 我假设在这里你将前一个例子以russiansample.xml为名保存在当前目录中。也出于完整性的考虑,我假设你已经删除了sitecustomize.py文件,将缺省编码改回到'ascii',或至少将setdefaultencoding一行注释起来了。
注意title标记的文本数据(现在在title变量中,幸亏有 Python 函数的常串联,我快速地将它跳过去,并且在下一节之前不会进行解释)--在 XML 文档的title元素中的文本数据是以unicode保存的。
打印title是不可能的,因为这个unicode字符串包哈了非 ASCII 字符,所以 Python 不能把它转换为 ASCII 因为它无法理解。
你能够,但是,显式的将它转换为koi8-r,在本例中,我们得到一个(正常,非unicode)单字节字符的字符串(f0, d2, c5,等等),它是初始unicode字符串中字符koi8-r-编码的版本。
打印koi8-r编码的字符串有可能会在你的屏幕上显示为乱码,因为你的 Python IDE 将这些字符作为 iso-8859-1的编码进行解析,而不是koi8-r编码。但是,至少它们能打印。(并且,如果你仔细看,当在一个不支持unicode的文本编辑器中打开最初的 XML 文档时,会看到相同的乱码。 Python 在解析 XML 文档时,将它从koi8-r转换到了unicode,你只不过是将它转换回来。)
总结一下,如果你以前从没有看到过unicode,倒是有些唬人,但是在 Python 处理unicode数据真是非常容易。如果你的 XML 文档都是7位的 ASCII(像本章中的例子),你差不多永远都不用考虑unicode。Python 在进行解析时会将 XML 文档中的 ASCII 数据转换为unicode,在任何需要的时候强制转换回为 ASCII,你甚至永远都不用注意。但是如果你要处理其它语言的数据,Python 已经准备好了。 |
|