This file is indexed.

/usr/share/doc/diveintopython-zh/html/xml_processing/unicode.html is in diveintopython-zh 5.4b-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   
      <title>9.4.&nbsp;Unicode</title>
      <link rel="stylesheet" href="../diveintopython.css" type="text/css">
      <link rev="made" href="mailto:f8dy@diveintopython.org">
      <meta name="generator" content="DocBook XSL Stylesheets V1.52.2">
      <meta name="keywords" content="Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free">
      <meta name="description" content="Python from novice to pro">
      <link rel="home" href="../toc/index.html" title="Dive Into Python">
      <link rel="up" href="index.html" title="第&nbsp;9&nbsp;章&nbsp;XML 处理">
      <link rel="previous" href="parsing_xml.html" title="9.3.&nbsp;XML 解析">
      <link rel="next" href="searching.html" title="9.5.&nbsp;搜索元素">
   </head>
   <body>
      <table id="Header" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
         <tr>
            <td id="breadcrumb" colspan="5" align="left" valign="top">导航:<a href="../index.html">起始页</a>&nbsp;&gt;&nbsp;<a href="../toc/index.html">Dive Into Python</a>&nbsp;&gt;&nbsp;<a href="index.html">XML 处理</a>&nbsp;&gt;&nbsp;<span class="thispage">Unicode</span></td>
            <td id="navigation" align="right" valign="top">&nbsp;&nbsp;&nbsp;<a href="parsing_xml.html" title="上一页: “XML 解析”">&lt;&lt;</a>&nbsp;&nbsp;&nbsp;<a href="searching.html" title="下一页: “搜索元素”">&gt;&gt;</a></td>
         </tr>
         <tr>
            <td colspan="3" id="logocontainer">
               <h1 id="logo"><a href="../index.html" accesskey="1">深入 Python :Dive Into Python 中文版</a></h1>
               <p id="tagline">Python 从新手到专家 [Dip_5.4b_CPyUG_Release]</p>
            </td>
            <td colspan="3" align="right">
               <form id="search" method="GET" action="http://www.google.com/custom">
                  <p><label for="q" accesskey="4">Find:&nbsp;</label><input type="text" id="q" name="q" size="20" maxlength="255" value=""> <input type="submit" value="搜索"><input type="hidden" name="domains" value="woodpecker.org.cn"><input type="hidden" name="sitesearch" value="www.woodpecker.org.cn/diveintopython"></p>
               </form>
            </td>
         </tr>
      </table>
      <!--#include virtual="/inc/ads" -->
      <div class="section" lang="zh_cn">
         <div class="titlepage">
            <div>
               <div>
                  <h2 class="title"><a name="kgp.unicode"></a>9.4.&nbsp;Unicode
                  </h2>
               </div>
            </div>
            <div></div>
         </div>
         <div class="abstract">
            <p>Unicode 是一个系统,用来表示世界上所有不同语言的字符。当 <span class="application">Python</span> 解析一个 <span class="acronym">XML</span> 文档时,所有的数据都是以unicode的形式保存在内存中的。
            </p>
         </div>
         <p>一会儿你就会了解,但首先,先看一些背景知识。</p>
         <p><b>历史注解.&nbsp;</b>在 unicode 之前,对于每一种语言都存在独立的字符编码系统,每个系统都使用相同的数字(0-255)来表示这种语言的字符。一些语言 (像俄语) 对于如何表示相同的字符还有几种有冲突的标准;另一些语言 (像日语) 拥有太多的字符,需要多个字符集。在系统之间进行文档交流是困难的,因为对于一台计算机来说,没有方法可以识别出文档的作者使用了哪种编码模式;计算机看到的只是数字,并且这些数字可以表示不同的东西。接着考虑到试图将这些
            (采用不同编码的) 文档存放到同一个地方 (比如在同一个数据库表中);你需要在每段文本的旁边保存字符的编码,并且确保在传递文本的同时将编码也进行传递。接着考虑多语言文档,即在同一文档中使用了不同语言的字符。(比较有代表性的是使用转义符来进行模式切换;噗,我们处于俄语
            koi8-r 模式,所以字符 241 表示这个;噗,现在我们处于 Mac 希腊语模式,所以字符 241 表示其它什么。等等。) 这些就是 unicode 被设计出来要解决的问题。
            
         </p>
         <p>为了解决这些问题,unicode 用一个 2 字节数字表示每个字符,从 0 到 65535。<sup>[<a name="d0e23942" href="#ftn.d0e23942">8</a>]</sup> 每个 2 字节数字表示至少在一种世界语言中使用的一个唯一字符。(在多种语言中都使用的字符具有相同的数字码。) 这样就确保每个字符一个数字,并且每个数字一个字符。Unicode 数据永远不会模棱两可。
         </p>
         <p>当然,仍然还存在着所有那些遗留的编码系统的情况。例如,7 位 <span class="acronym">ASCII</span>,它可以将英文字符存诸为从 0 到 127 的数值。(65 是大写字母 “<span class="quote"><tt class="literal">A</tt></span>”,97 是小写字母 “<span class="quote"><tt class="literal">a</tt></span>”,等等。) 英语有着非常简单的字母表,所以它可以完全用 7 位 <span class="acronym">ASCII</span> 来表示。像法语、西班牙语和德语之类的西欧语言都使用叫做 ISO-8859-1 的编码系统 (也叫做“<span class="quote">latin-1</span>”),它使用 7 位 <span class="acronym">ASCII</span> 字符表示从 0 到 127 的数字,但接着扩展到了 128-255 的范围来表示像 n 上带有一个波浪线(241),和 u 上带有两个点(252)的字符。Unicode 在 0 到 127 上使用了同 7 位 <span class="acronym">ASCII</span> 码一样的字符表,在 128 到 255上同 ISO-8859-1 一样,接着使用剩余的数字,256 到 65535,扩展到表示其它语言的字符。
         </p>
         <p>在处理 unicode 数据时,在某些地方你可能需要将数据转换回这些遗留编码系统之一。例如,为了同其它一些计算机系统集成,这些系统期望它的数据使用一种特定的单字节编码模式,或将数据打印输出到一个不识别 unicode 的终端或打印机。或将数据保存到一个明确指定编码模式的
            <span class="acronym">XML</span> 文档中。
         </p>
         <p>在了解这个注解之后,让我们回到 <span class="application">Python</span>上来。
         </p>
         <p>从 2.0 版开始,<span class="application">Python</span> 整个语言都已经支持 unicode。<span class="acronym">XML</span> 包使用 unicode 来保存所有解析了的 <span class="acronym">XML</span> 数据,而且你可以在任何地方使用 unicode。
         </p>
         <div class="example"><a name="d0e23998"></a><h3 class="title">&nbsp;9.13.&nbsp;unicode 介绍</h3><pre class="screen">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">s = u<span class='pystring'>'Dive in'</span></span>            <a name="kgp.unicode.1.1"></a><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">s</span>
<span class="computeroutput">u'Dive in'</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>print</span> s</span>                   <a name="kgp.unicode.1.2"></a><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12">
<span class="computeroutput">Dive in</span></pre><div class="calloutlist">
               <table border="0" summary="Callout list">
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.1.1"><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">为了创建一个 unicode 字符串而不是通常的 <span class="acronym">ASCII</span> 字符串,要在字符串前面加上字母 “<span class="quote"><tt class="literal">u</tt></span>”。注意这个特殊的字符串没有任何非 <span class="acronym">ASCII</span> 的字符。这样很好;unicode 是 <span class="acronym">ASCII</span> 的一个超集 (一个非常大的超集),所以任何正常的 <span class="acronym">ASCII</span> 都可以以 unicode 形式保存起来。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.1.2"><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">在打印字符串时,<span class="application">Python</span> 试图将字符串转换为你的默认编码,通常是 <span class="acronym">ASCII</span> 。(过会儿有更详细的说明。) 因为组成这个 unicode 字符串的字符都是 <span class="acronym">ASCII</span> 字符,打印结果与打印正常的 <span class="acronym">ASCII</span> 字符串是一样的;转换是无缝的,而且如果你没有注意到 <tt class="varname">s</tt> 是一个 unicode 字符串的话,你永远也不会注意到两者之间的差别。
                     </td>
                  </tr>
               </table>
            </div>
         </div>
         <div class="example"><a name="d0e24065"></a><h3 class="title">&nbsp;9.14.&nbsp;存储非 <span class="acronym">ASCII</span> 字符
            </h3><pre class="screen">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">s = u<span class='pystring'>'La Pe\xf1a'</span></span>         <a name="kgp.unicode.2.1"></a><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>print</span> s</span>                   <a name="kgp.unicode.2.2"></a><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12">
<span class="traceback">Traceback (innermost last):
  File "&lt;interactive input&gt;", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>print</span> s.encode(<span class='pystring'>'latin-1'</span>)</span> <a name="kgp.unicode.2.3"></a><img src="../images/callouts/3.png" alt="3" border="0" width="12" height="12">
<span class="computeroutput">La Peña</span></pre><div class="calloutlist">
               <table border="0" summary="Callout list">
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.2.1"><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">unicode 真正的优势,理所当然的是它保存非 <span class="acronym">ASCII</span> 字符的能力,例如西班牙语的 “<span class="quote"><tt class="literal">ñ</tt></span>”(<tt class="literal">n</tt> 上带有一个波浪线)。用来表示波浪线 n 的 unicode 字符编码是十六进制的 <tt class="literal">0xf1</tt> (十进制的241),你可以像这样输入:<tt class="literal">\xf1</tt></td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.2.2"><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">还记得我说过 <tt class="function">print</tt> 函数会尝试将 unicode 字符串转换为 <span class="acronym">ASCII</span> 从而打印它吗?嗯,在这里将不会起作用,因为你的 unicode 字符串包含非 <span class="acronym">ASCII</span> 字符,所以 <span class="application">Python</span> 会引发 <tt class="errorname">UnicodeError</tt> 异常。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.2.3"><img src="../images/callouts/3.png" alt="3" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">这儿就是将 unicode 转换为其它编码模式起作用的地方。<tt class="varname">s</tt> 是一个 unicode 字符串,但 <tt class="function">print</tt> 只能打印正常的字符串。为了解决这个问题,我们调用 <tt class="function">encode</tt> 方法 (它可以用于每个 unicode 字符串) 将 unicode 字符串转换为指定编码模式的正常字符串。我们向此函数传入一个参数。在本例中,我们使用 <tt class="literal">latin-1</tt> (也叫 <tt class="literal">iso-8859-1</tt>),它包括带波浪线的 n (然而缺省的 <span class="acronym">ASCII</span> 编码模式不包括,因为它只包含数值从 0 到 127 的字符)。
                     </td>
                  </tr>
               </table>
            </div>
         </div>
         <p>还记得我说过:需要从一个 unicode 得到一个正常字符串时,<span class="application">Python</span> 通常默认将 unicode 转换成 <span class="acronym">ASCII</span> 吗?嗯,这个默认编码模式是一个可以定制的选项。
         </p>
         <div class="example"><a name="d0e24166"></a><h3 class="title">&nbsp;9.15.&nbsp;<tt class="filename">sitecustomize.py</tt></h3><pre class="programlisting">
<span class='pycomment'># sitecustomize.py                   </span><a name="kgp.unicode.3.1"></a><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12">
<span class='pycomment'># this file can be anywhere in your Python path,</span>
<span class='pycomment'># but it usually goes in ${pythondir}/lib/site-packages/</span>
<span class='pykeyword'>import</span> sys
sys.setdefaultencoding(<span class='pystring'>'iso-8859-1'</span>) <a name="kgp.unicode.3.2"></a><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12">
</pre><div class="calloutlist">
               <table border="0" summary="Callout list">
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.3.1"><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left"><tt class="filename">sitecustomize.py</tt> 是一个特殊的脚本;<span class="application">Python</span> 会在启动的时候导入它,所以在其中的任何代码都将自动运行。就像注解中提到的那样,它可以放在任何地方 (只要 <tt class="literal">import</tt> 能够找到它),但是通常它位于 <span class="application">Python</span><tt class="filename">lib</tt> 目录的 <tt class="filename">site-packages</tt> 目录中。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.3.2"><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">嗯,<tt class="function">setdefaultencoding</tt> 函数设置默认编码。<span class="application">Python</span> 会在任何需要将 unicode 字符串自动转换为正规字符串的地方,使用这个编码模式。
                     </td>
                  </tr>
               </table>
            </div>
         </div>
         <div class="example"><a name="d0e24206"></a><h3 class="title">&nbsp;9.16.&nbsp;设置默认编码的效果</h3><pre class="screen">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>import</span> sys</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">sys.getdefaultencoding()</span> <a name="kgp.unicode.4.1"></a><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12">
<span class="computeroutput">'iso-8859-1'</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">s = u<span class='pystring'>'La Pe\xf1a'</span></span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>print</span> s</span>                  <a name="kgp.unicode.4.2"></a><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12">
<span class="computeroutput">La Peña</span></pre><div class="calloutlist">
               <table border="0" summary="Callout list">
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.4.1"><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">这个例子假设你已经按前一个例子中的改动对 <tt class="filename">sitecustomize.py</tt> 文件做了修改,并且已经重启了 <span class="application">Python</span>。如果你的默认编码还是 <tt class="literal">'ascii'</tt>,可能你就没有正确设置 <tt class="filename">sitecustomize.py</tt> 文件,或者是没有重新启动 <span class="application">Python</span>。默认的编码只能在 <span class="application">Python</span> 启动的时候改变;之后就不能改变了。(由于一些我们现在不会仔细研究的古怪的编程技巧,你甚至不能在 <span class="application">Python</span> 启动之后调用 <tt class="function">sys.setdefaultencoding</tt> 函数。仔细研究 <tt class="filename">site.py</tt>,并搜索 “<span class="quote"><tt class="literal">setdefaultencoding</tt></span>” 去发现为什么吧。)
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.4.2"><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">现在默认的编码模式已经包含了你在字符串中使用的所有字符,<span class="application">Python</span> 对字符串的自动强制转换和打印就不存在问题了。
                     </td>
                  </tr>
               </table>
            </div>
         </div>
         <div class="example"><a name="d0e24281"></a><h3 class="title">&nbsp;9.17.&nbsp;指定<tt class="filename">.py</tt>文件的编码
            </h3>
            <p>如果你打算在你的 <span class="application">Python</span> 代码中保存非 <span class="acronym">ASCII</span> 字符串,你需要在每个文件的顶端加入编码声明来指定每个 <tt class="filename">.py</tt> 文件的编码。这个声明定义了 <tt class="filename">.py</tt> 文件的编码为 UTF-8:
            </p><pre class="programlisting">
<span class='pycomment'>#!/usr/bin/env python</span>
<span class='pycomment'># -*- coding: UTF-8 -*-</span>
</pre></div>
         <p>现在,想想 <span class="acronym">XML</span> 中的编码应该是怎样的呢?不错,每一个 <span class="acronym">XML</span> 文档都有指定的编码。重复一下,ISO-8859-1 是西欧语言存放数据的流行编码方式。KOI8-R 是俄语流行的编码方式。编码――如果指定了的话――都在 <span class="acronym">XML</span> 文档的首部。
         </p>
         <div class="example"><a name="d0e24314"></a><h3 class="title">&nbsp;9.18.&nbsp;<tt class="filename">russiansample.xml</tt></h3><pre class="screen"><span class="computeroutput">
&lt;?xml version="1.0" encoding="koi8-r"?&gt;       </span><a name="kgp.unicode.5.1"></a><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12"><span class="computeroutput">
&lt;preface&gt;
&lt;title&gt;Предисловие&lt;/title&gt;                    </span><a name="kgp.unicode.5.2"></a><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12"><span class="computeroutput">
&lt;/preface&gt;</span></pre><div class="calloutlist">
               <table border="0" summary="Callout list">
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.5.1"><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">这是从一个真实的俄语 <span class="acronym">XML</span> 文档中提取出来的示例;它就是这本书俄语翻译版的一部分。注意,编码 <tt class="literal">koi8-r</tt> 是在首部指定的。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.5.2"><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">这些是古代斯拉夫语的字符,就我所知,它们用来拼写俄语单词“<span class="quote">Preface</span>”。如果你在一个正常文本编辑器中打开这个文件,这些字符非常像乱码,因为它们使用了 <tt class="literal">koi8-r</tt> 编码模式进行编码,但是却以 <tt class="literal">iso-8859-1</tt> 编码模式进行显示。
                     </td>
                  </tr>
               </table>
            </div>
         </div>
         <div class="example"><a name="d0e24349"></a><h3 class="title">&nbsp;9.19.&nbsp;解析 <tt class="filename">russiansample.xml</tt></h3><pre class="screen">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>from</span> xml.dom <span class='pykeyword'>import</span> minidom</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">xmldoc = minidom.parse(<span class='pystring'>'russiansample.xml'</span>)</span> <a name="kgp.unicode.6.1"></a><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">title = xmldoc.getElementsByTagName(<span class='pystring'>'title'</span>)[0].firstChild.data</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">title</span>                                       <a name="kgp.unicode.6.2"></a><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12">
<span class="computeroutput">u'\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435'</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>print</span> title</span>                                 <a name="kgp.unicode.6.3"></a><img src="../images/callouts/3.png" alt="3" border="0" width="12" height="12">
<span class="traceback">Traceback (innermost last):
  File "&lt;interactive input&gt;", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">convertedtitle = title.encode(<span class='pystring'>'koi8-r'</span>)</span>     <a name="kgp.unicode.6.4"></a><img src="../images/callouts/4.png" alt="4" border="0" width="12" height="12">
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput">convertedtitle</span>
<span class="computeroutput">'\xf0\xd2\xc5\xc4\xc9\xd3\xcc\xcf\xd7\xc9\xc5'</span>
<tt class="prompt">&gt;&gt;&gt; </tt><span class="userinput"><span class='pykeyword'>print</span> convertedtitle</span>                        <a name="kgp.unicode.6.5"></a><img src="../images/callouts/5.png" alt="5" border="0" width="12" height="12">
<span class="computeroutput">Предисловие</span></pre><div class="calloutlist">
               <table border="0" summary="Callout list">
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.6.1"><img src="../images/callouts/1.png" alt="1" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">我假设在这里你将前一个例子以 <tt class="filename">russiansample.xml</tt> 为名保存在当前目录中。也出于完整性的考虑,我假设你已经删除了 <tt class="filename">sitecustomize.py</tt> 文件,将缺省编码改回到 <tt class="literal">'ascii'</tt>,或至少将 <tt class="function">setdefaultencoding</tt> 一行注释起来了。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.6.2"><img src="../images/callouts/2.png" alt="2" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">注意 <tt class="sgmltag-element">title</tt> 标记 (现在在 <tt class="varname">title</tt> 变量中,上面那一长串 <span class="application">Python</span> 函数我们暂且跳过,下一节再解释)――在 <span class="acronym">XML</span> 文档的 <tt class="sgmltag-element">title</tt> 元素中的文本数据是以 unicode 保存的。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.6.3"><img src="../images/callouts/3.png" alt="3" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">直接打印 title 是不可能的,因为这个 unicode 字符串包含了非 <span class="acronym">ASCII</span> 字符,所以 <span class="application">Python</span> 不能把它转换为 <span class="acronym">ASCII</span>,因为它无法理解。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.6.4"><img src="../images/callouts/4.png" alt="4" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">但是,你能够显式地将它转换为 <tt class="literal">koi8-r</tt>,在本例中,我们得到一个 (正常,非 unicode) 单字节字符的字符串 (<tt class="literal">f0</tt>, <tt class="literal">d2</tt>, <tt class="literal">c5</tt>,等等),它是初始unicode字符串中字符 <tt class="literal">koi8-r</tt> 编码的版本。
                     </td>
                  </tr>
                  <tr>
                     <td width="12" valign="top" align="left"><a href="#kgp.unicode.6.5"><img src="../images/callouts/5.png" alt="5" border="0" width="12" height="12"></a> 
                     </td>
                     <td valign="top" align="left">打印 <tt class="literal">koi8-r</tt> 编码的字符串有可能会在你的屏幕上显示为乱码,因为你的 <span class="application">Python</span> <span class="acronym">IDE</span> 将这些字符作为 <tt class="literal">iso-8859-1</tt> 的编码进行解析,而不是 <tt class="literal">koi8-r</tt> 编码。但是,至少它们能打印。 (并且,如果你仔细看,当在一个不支持 unicode 的文本编辑器中打开最初的 <span class="acronym">XML</span> 文档时,会看到相同的乱码。<span class="application">Python</span> 在解析 <span class="acronym">XML</span> 文档时,将它从 <tt class="literal">koi8-r</tt> 转换到了unicode,你只不过是将它转换回来。)
                     </td>
                  </tr>
               </table>
            </div>
         </div>
         <p>总结一下,如果你以前从没有看到过 unicode,倒是有些唬人,但是在 <span class="application">Python</span> 处理 unicode 数据真是非常容易。如果你的 <span class="acronym">XML</span> 文档都是 7 位的 <span class="acronym">ASCII</span> (像本章中的例子),你差不多永远都不用考虑 unicode。<span class="application">Python</span> 在进行解析时会将 <span class="acronym">XML</span> 文档中的 <span class="acronym">ASCII</span> 数据转换为 unicode,在任何需要的时候强制转换回为 <span class="acronym">ASCII</span>,你甚至永远都不用注意。但是如果你要处理其它语言的数据,<span class="application">Python</span> 已经准备好了。
         </p>
         <div class="furtherreading">
            <h3>进一步阅读</h3>
            <ul>
               <li><a href="http://www.unicode.org/">Unicode.org</a> 是 unicode 标准的主页,包含了一个简要的<a href="http://www.unicode.org/standard/principles.html">技术简介</a></li>
               <li><a href="http://www.reportlab.com/i18n/python_unicode_tutorial.html">Unicode 教程</a>有更多关于如何使用 <span class="application">Python</span> unicode 函数的例子,包括甚至在并不真的需要时如何将 unicode 强制转换为 <span class="acronym">ASCII</span></li>
               <li><a href="http://www.python.org/peps/pep-0263.html">PEP 263</a> 涉及了何时、如何在你的<tt class="filename">.py</tt>文件中定义字符编码的更多细节。
               </li>
            </ul>
         </div>
         <div class="footnotes">
            <h3 class="footnotetitle">Footnotes</h3>
            <div class="footnote">
               <p><sup>[<a name="ftn.d0e23942" href="#d0e23942">8</a>] </sup>这一点,很不幸<span class="emphasis"><em>仍然</em></span> 过分简单了。现在 unicode 已经扩展用来处理古老的汉字、韩文和日文文本,它们有太多不同的字符,以至于 2 字节的 unicode 系统不能全部表示。但当前 <span class="application">Python</span> 不支持超出范围的编码,并且我不知道是否有正在计划进行解决的项目。对不起,你已经到了我经验的极限了。
               </p>
            </div>
         </div>
      </div>
      <table class="Footer" width="100%" border="0" cellpadding="0" cellspacing="0" summary="">
         <tr>
            <td width="35%" align="left"><br><a class="NavigationArrow" href="parsing_xml.html">&lt;&lt;&nbsp;XML 解析</a></td>
            <td width="30%" align="center"><br>&nbsp;<span class="divider">|</span>&nbsp;<a href="index.html#kgp.divein" title="9.1.&nbsp;概览">1</a> <span class="divider">|</span> <a href="packages.html" title="9.2.&nbsp;包">2</a> <span class="divider">|</span> <a href="parsing_xml.html" title="9.3.&nbsp;XML 解析">3</a> <span class="divider">|</span> <span class="thispage">4</span> <span class="divider">|</span> <a href="searching.html" title="9.5.&nbsp;搜索元素">5</a> <span class="divider">|</span> <a href="attributes.html" title="9.6.&nbsp;访问元素属性">6</a> <span class="divider">|</span> <a href="summary.html" title="9.7.&nbsp;Segue ">7</a>&nbsp;<span class="divider">|</span>&nbsp;
            </td>
            <td width="35%" align="right"><br><a class="NavigationArrow" href="searching.html">搜索元素&nbsp;&gt;&gt;</a></td>
         </tr>
         <tr>
            <td colspan="3"><br></td>
         </tr>
      </table>
      <div class="Footer">
         <p class="copyright">Copyright © 2000, 2001, 2002, 2003, 2004 <a href="mailto:mark@diveintopython.org">Mark Pilgrim</a></p>
         <p class="copyright">Copyright © 2001, 2002, 2003, 2004, 2005, 2006, 2007 <a href="mailto:python-cn@googlegroups.com">CPyUG (邮件列表)</a></p>
      </div>
   </body>
</html>