青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我希望你是我獨(dú)家記憶

一段永遠(yuǎn)封存的記憶,隨風(fēng)而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首頁(yè) :: 新隨筆 ::  :: 聚合  :: 管理

[轉(zhuǎn)載] python中文編碼問題

Posted on 2009-07-24 14:30 Hero 閱讀(2342) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 資料整理
 

Unicode 是一個(gè)系統(tǒng),用來表示世界上所有不同語(yǔ)言的字符。當(dāng) Python 解析一個(gè) XML 文檔時(shí),所有的數(shù)據(jù)都是以u(píng)nicode的形式保存在內(nèi)存中的。

一會(huì)兒你就會(huì)了解,但首先,先看一些背景知識(shí)。

歷史注解. 在 unicode 之前,對(duì)于每一種語(yǔ)言都存在獨(dú)立的字符編碼系統(tǒng),每個(gè)系統(tǒng)都使用相同的數(shù)字(0-255)來表示這種語(yǔ)言的字符。一些語(yǔ)言 (像俄語(yǔ)) 對(duì)于如何表示相同的字符還有幾種有沖突的標(biāo)準(zhǔn);另一些語(yǔ)言 (像日語(yǔ)) 擁有太多的字符,需要多個(gè)字符集。在系統(tǒng)之間進(jìn)行文檔交流是困難的,因?yàn)閷?duì)于一臺(tái)計(jì)算機(jī)來說,沒有方法可以識(shí)別出文檔的作者使用了哪種編碼模式;計(jì)算機(jī)看 到的只是數(shù)字,并且這些數(shù)字可以表示不同的東西。接著考慮到試圖將這些 (采用不同編碼的) 文檔存放到同一個(gè)地方 (比如在同一個(gè)數(shù)據(jù)庫(kù)表中);你需要在每段文本的旁邊保存字符的編碼,并且確保在傳遞文本的同時(shí)將編碼也進(jìn)行傳遞。接著考慮多語(yǔ)言文檔,即在同一文檔中使 用了不同語(yǔ)言的字符。(比較有代表性的是使用轉(zhuǎn)義符來進(jìn)行模式切換;噗,我們處于俄語(yǔ) koi8-r 模式,所以字符 241 表示這個(gè);噗,現(xiàn)在我們處于 Mac 希臘語(yǔ)模式,所以字符 241 表示其它什么。等等。) 這些就是 unicode 被設(shè)計(jì)出來要解決的問題。

為了解決這些問題,unicode 用一個(gè) 2 字節(jié)數(shù)字表示每個(gè)字符,從 0 到 65535。[8] 每個(gè) 2 字節(jié)數(shù)字表示至少在一種世界語(yǔ)言中使用的一個(gè)唯一字符。(在多種語(yǔ)言中都使用的字符具有相同的數(shù)字碼。) 這樣就確保每個(gè)字符一個(gè)數(shù)字,并且每個(gè)數(shù)字一個(gè)字符。Unicode 數(shù)據(jù)永遠(yuǎn)不會(huì)模棱兩可。

當(dāng)然,仍然還存在著所有那些遺留的編碼系統(tǒng)的情況。例如,7 位 ASCII,它可以將英文字符存諸為從 0 到 127 的數(shù)值。(65 是大寫字母 “A”,97 是小寫字母 “a”,等等。) 英語(yǔ)有著非常簡(jiǎn)單的字母表,所以它可以完全用 7 位 ASCII 來表示。像法語(yǔ)、西班牙語(yǔ)和德語(yǔ)之類的西歐語(yǔ)言都使用叫做 ISO-8859-1 的編碼系統(tǒng) (也叫做“latin-1”),它使用 7 位 ASCII 字符表示從 0 到 127 的數(shù)字,但接著擴(kuò)展到了 128-255 的范圍來表示像 n 上帶有一個(gè)波浪線(241),和 u 上帶有兩個(gè)點(diǎn)(252)的字符。Unicode 在 0 到 127 上使用了同 7 位 ASCII 碼一樣的字符表,在 128 到 255上同 ISO-8859-1 一樣,接著使用剩余的數(shù)字,256 到 65535,擴(kuò)展到表示其它語(yǔ)言的字符。

在 處理 unicode 數(shù)據(jù)時(shí),在某些地方你可能需要將數(shù)據(jù)轉(zhuǎn)換回這些遺留編碼系統(tǒng)之一。例如,為了同其它一些計(jì)算機(jī)系統(tǒng)集成,這些系統(tǒng)期望它的數(shù)據(jù)使用一種特定的單字節(jié)編碼模 式,或?qū)?shù)據(jù)打印輸出到一個(gè)不識(shí)別 unicode 的終端或打印機(jī)。或?qū)?shù)據(jù)保存到一個(gè)明確指定編碼模式的 XML 文檔中。

在了解這個(gè)注解之后,讓我們回到 Python上來。

從 2.0 版開始,Python 整個(gè)語(yǔ)言都已經(jīng)支持 unicode。XML 包使用 unicode 來保存所有解析了的 XML 數(shù)據(jù),而且你可以在任何地方使用 unicode。

例 9.13. unicode 介紹

>>> s = u'Dive in'            1
>>> s
u'Dive in'
>>> print s 2
Dive in
1 為了創(chuàng)建一個(gè) unicode 字符串而不是通常的 ASCII 字符串,要在字符串前面加上字母 “u”。注意這個(gè)特殊的字符串沒有任何非 ASCII 的字符。這樣很好;unicode 是 ASCII 的一個(gè)超集 (一個(gè)非常大的超集),所以任何正常的 ASCII 都可以以 unicode 形式保存起來。
2 在打印字符串時(shí),Python 試圖將字符串轉(zhuǎn)換為你的默認(rèn)編碼,通常是 ASCII 。(過會(huì)兒有更詳細(xì)的說明。) 因?yàn)榻M成這個(gè) unicode 字符串的字符都是 ASCII 字符,打印結(jié)果與打印正常的 ASCII 字符串是一樣的;轉(zhuǎn)換是無(wú)縫的,而且如果你沒有注意到 s 是一個(gè) unicode 字符串的話,你永遠(yuǎn)也不會(huì)注意到兩者之間的差別。

例 9.14. 存儲(chǔ)非 ASCII 字符

>>> s = u'La Pe\xf1a'         1
>>> print s 2
Traceback (innermost last):
File "<interactive input>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

>>> print s.encode('latin-1') 3
La Peña
1 unicode 真正的優(yōu)勢(shì),理所當(dāng)然的是它保存非 ASCII 字符的能力,例如西班牙語(yǔ)的 “ñ”(n 上帶有一個(gè)波浪線)。用來表示波浪線 n 的 unicode 字符編碼是十六進(jìn)制的 0xf1 (十進(jìn)制的241),你可以像這樣輸入:\xf1
2 還記得我說過 print 函數(shù)會(huì)嘗試將 unicode 字符串轉(zhuǎn)換為 ASCII 從而打印它嗎?嗯,在這里將不會(huì)起作用,因?yàn)槟愕?unicode 字符串包含非 ASCII 字符,所以 Python 會(huì)引發(fā) UnicodeError 異常。
3 這兒就是將 unicode 轉(zhuǎn)換為其它編碼模式起作用的地方。s 是一個(gè) unicode 字符串,但 print 只能打印正常的字符串。為了解決這個(gè)問題,我們調(diào)用 encode 方法 (它可以用于每個(gè) unicode 字符串) 將 unicode 字符串轉(zhuǎn)換為指定編碼模式的正常字符串。我們向此函數(shù)傳入一個(gè)參數(shù)。在本例中,我們使用 latin-1 (也叫 iso-8859-1),它包括帶波浪線的 n (然而缺省的 ASCII 編碼模式不包括,因?yàn)樗话瑪?shù)值從 0 到 127 的字符)。

還記得我說過:需要從一個(gè) unicode 得到一個(gè)正常字符串時(shí),Python 通常默認(rèn)將 unicode 轉(zhuǎn)換成 ASCII 嗎?嗯,這個(gè)默認(rèn)編碼模式是一個(gè)可以定制的選項(xiàng)。

例 9.15. sitecustomize.py

# sitecustomize.py                   1
# this file can be anywhere in your Python path,
# but it usually goes in ${pythondir}/lib/site-packages/
import sys
sys.setdefaultencoding('iso-8859-1') 2
1 sitecustomize.py 是一個(gè)特殊的腳本;Python 會(huì)在啟動(dòng)的時(shí)候?qū)胨栽谄渲械娜魏未a都將自動(dòng)運(yùn)行。就像注解中提到的那樣,它可以放在任何地方 (只要 import 能夠找到它),但是通常它位于 Pythonlib 目錄的 site-packages 目錄中。
2 嗯,setdefaultencoding 函數(shù)設(shè)置默認(rèn)編碼。Python 會(huì)在任何需要將 unicode 字符串自動(dòng)轉(zhuǎn)換為正規(guī)字符串的地方,使用這個(gè)編碼模式。

例 9.16. 設(shè)置默認(rèn)編碼的效果

>>> import sys
>>> sys.getdefaultencoding() 1
'iso-8859-1'
>>> s = u'La Pe\xf1a'
>>> print s 2
La Peña
1 這個(gè)例子假設(shè)你已經(jīng)按前一個(gè)例子中的改動(dòng)對(duì) sitecustomize.py 文件做了修改,并且已經(jīng)重啟了 Python。如果你的默認(rèn)編碼還是 'ascii',可能你就沒有正確設(shè)置 sitecustomize.py 文件,或者是沒有重新啟動(dòng) Python。默認(rèn)的編碼只能在 Python 啟動(dòng)的時(shí)候改變;之后就不能改變了。(由于一些我們現(xiàn)在不會(huì)仔細(xì)研究的古怪的編程技巧,你甚至不能在 Python 啟動(dòng)之后調(diào)用 sys.setdefaultencoding 函數(shù)。仔細(xì)研究 site.py,并搜索 “setdefaultencoding” 去發(fā)現(xiàn)為什么吧。)
2 現(xiàn)在默認(rèn)的編碼模式已經(jīng)包含了你在字符串中使用的所有字符,Python 對(duì)字符串的自動(dòng)強(qiáng)制轉(zhuǎn)換和打印就不存在問題了。

例 9.17. 指定.py文件的編碼

如果你打算在你的 Python 代碼中保存非 ASCII 字符串,你需要在每個(gè)文件的頂端加入編碼聲明來指定每個(gè) .py 文件的編碼。這個(gè)聲明定義了 .py 文件的編碼為 UTF-8:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

現(xiàn)在,想想 XML 中的編碼應(yīng)該是怎樣的呢?不錯(cuò),每一個(gè) XML 文檔都有指定的編碼。重復(fù)一下,ISO-8859-1 是西歐語(yǔ)言存放數(shù)據(jù)的流行編碼方式。KOI8-R 是俄語(yǔ)流行的編碼方式。編碼――如果指定了的話――都在 XML 文檔的首部。

例 9.18. russiansample.xml


<?xml version="1.0" encoding="koi8-r"?>
1
<preface>
<title>Предисловие</title>
2
</preface>
1 這是從一個(gè)真實(shí)的俄語(yǔ) XML 文檔中提取出來的示例;它就是這本書俄語(yǔ)翻譯版的一部分。注意,編碼 koi8-r 是在首部指定的。
2 這些是古代斯拉夫語(yǔ)的字符,就我所知,它們用來拼寫俄語(yǔ)單詞“Preface”。如果你在一個(gè)正常文本編輯器中打開這個(gè)文件,這些字符非常像亂碼,因?yàn)樗鼈兪褂昧?koi8-r 編碼模式進(jìn)行編碼,但是卻以 iso-8859-1 編碼模式進(jìn)行顯示。

例 9.19. 解析 russiansample.xml

>>> from xml.dom import minidom
>>> xmldoc = minidom.parse('russiansample.xml') 1
>>> title = xmldoc.getElementsByTagName('title')[0].firstChild.data
>>> title 2
u'\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435'
>>> print title 3
Traceback (innermost last):
File "<interactive input>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

>>> convertedtitle = title.encode('koi8-r') 4
>>> convertedtitle
'\xf0\xd2\xc5\xc4\xc9\xd3\xcc\xcf\xd7\xc9\xc5'
>>> print convertedtitle 5
Предисловие
1 我假設(shè)在這里你將前一個(gè)例子以 russiansample.xml 為名保存在當(dāng)前目錄中。也出于完整性的考慮,我假設(shè)你已經(jīng)刪除了 sitecustomize.py 文件,將缺省編碼改回到 'ascii',或至少將 setdefaultencoding 一行注釋起來了。
2 注意 title 標(biāo)記 (現(xiàn)在在 title 變量中,上面那一長(zhǎng)串 Python 函數(shù)我們暫且跳過,下一節(jié)再解釋)――在 XML 文檔的 title 元素中的文本數(shù)據(jù)是以 unicode 保存的。
3 直接打印 title 是不可能的,因?yàn)檫@個(gè) unicode 字符串包含了非 ASCII 字符,所以 Python 不能把它轉(zhuǎn)換為 ASCII,因?yàn)樗鼰o(wú)法理解。
4 但是,你能夠顯式地將它轉(zhuǎn)換為 koi8-r,在本例中,我們得到一個(gè) (正常,非 unicode) 單字節(jié)字符的字符串 (f0, d2, c5,等等),它是初始unicode字符串中字符 koi8-r 編碼的版本。
5 打印 koi8-r 編碼的字符串有可能會(huì)在你的屏幕上顯示為亂碼,因?yàn)槟愕?Python IDE 將這些字符作為 iso-8859-1 的編碼進(jìn)行解析,而不是 koi8-r 編碼。但是,至少它們能打印。 (并且,如果你仔細(xì)看,當(dāng)在一個(gè)不支持 unicode 的文本編輯器中打開最初的 XML 文檔時(shí),會(huì)看到相同的亂碼。Python 在解析 XML 文檔時(shí),將它從 koi8-r 轉(zhuǎn)換到了unicode,你只不過是將它轉(zhuǎn)換回來。)

總結(jié)一下,如果你以前從沒有看到過 unicode,倒是有些唬人,但是在 Python 處理 unicode 數(shù)據(jù)真是非常容易。如果你的 XML 文檔都是 7 位的 ASCII (像本章中的例子),你差不多永遠(yuǎn)都不用考慮 unicode。Python 在進(jìn)行解析時(shí)會(huì)將 XML 文檔中的 ASCII 數(shù)據(jù)轉(zhuǎn)換為 unicode,在任何需要的時(shí)候強(qiáng)制轉(zhuǎn)換回為 ASCII,你甚至永遠(yuǎn)都不用注意。但是如果你要處理其它語(yǔ)言的數(shù)據(jù),Python 已經(jīng)準(zhǔn)備好了。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性久久久久久| 亚洲欧美日韩区| 国产日韩一区在线| 亚洲理伦在线| 亚洲毛片在线观看.| 久久精品一区二区三区不卡| 午夜激情综合网| 欧美日韩国产综合网| 欧美激情aⅴ一区二区三区| 狠狠入ady亚洲精品| 亚洲欧美在线视频观看| 亚洲欧美不卡| 欧美性生交xxxxx久久久| 91久久久久久久久| 亚洲国产精品成人综合色在线婷婷| 香蕉乱码成人久久天堂爱免费 | 母乳一区在线观看| 牛牛国产精品| 1024成人网色www| 久久天堂国产精品| 欧美电影免费观看大全| 极品av少妇一区二区| 欧美在线视频在线播放完整版免费观看| 午夜精品视频一区| 国产精品欧美日韩| 亚洲影视在线| 久久精品综合一区| 国产综合色产在线精品| 欧美伊久线香蕉线新在线| 一二三四社区欧美黄| 久久激五月天综合精品| 久久久久久久一区| 韩国免费一区| 香蕉久久夜色精品国产使用方法| 欧美日韩免费观看一区二区三区| 亚洲欧美在线aaa| 亚洲欧美日韩精品一区二区| 欧美成年人视频| 亚洲视频在线观看免费| 亚洲视频999| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲女人天堂成人av在线| 最新日韩精品| 免费永久网站黄欧美| 免费观看不卡av| 亚洲作爱视频| 久久精品人人| 国产日韩欧美视频| 亚洲精品在线电影| 日韩小视频在线观看专区| 亚洲福利视频免费观看| 99在线视频精品| 在线成人激情| 欧美国产视频一区二区| 99国产精品久久久久久久成人热| 亚洲一区二区av电影| 久久综合中文字幕| 一本色道久久88综合亚洲精品ⅰ| 两个人的视频www国产精品| 欧美日韩亚洲一区三区| 日韩一区二区免费高清| 一区电影在线观看| 欧美一区二区视频观看视频| 久久亚洲不卡| 99精品欧美一区| 狼狼综合久久久久综合网 | 欧美成人在线网站| 欧美—级高清免费播放| 国产亚洲精品aa午夜观看| 久久久久成人精品| 久久成人综合视频| 亚洲国产91精品在线观看| 在线综合亚洲| 狠狠色丁香久久婷婷综合丁香| 亚洲欧美成人一区二区三区| 国产亚洲一本大道中文在线| 中文av一区特黄| 欧美激情麻豆| 一区二区三欧美| 在线观看亚洲一区| 亚洲电影天堂av| 免费观看一级特黄欧美大片| 午夜精品国产| 亚洲精选中文字幕| 亚洲电影有码| 久久一区激情| 久久成人人人人精品欧| 亚洲午夜在线观看| 亚洲精品韩国| 在线看国产日韩| 国产乱肥老妇国产一区二| 欧美日本精品| 欧美电影免费网站| 老司机免费视频久久| 久久久精品午夜少妇| 欧美一区二区三区精品| 一本色道久久综合亚洲91| 91久久亚洲| 亚洲国产精品成人| 欧美国产日产韩国视频| 欧美成人免费在线| 久久免费国产| 久久久久久久97| 久久er精品视频| 欧美中文日韩| 久久天堂av综合合色| 久久精品国产第一区二区三区最新章节 | 久久激情综合网| 欧美一级免费视频| 亚洲综合首页| 欧美一区二区在线观看| 欧美一区二区在线免费观看| 欧美影院久久久| 久久精品欧美日韩精品| 久久久久在线观看| 看欧美日韩国产| 欧美高清影院| 欧美三级视频| 国产精品日韩一区| 国产一区久久| 亚洲激情av| 夜夜夜精品看看| 亚洲欧美亚洲| 久久久久久久久蜜桃| 麻豆久久久9性大片| 欧美高清不卡| 一本色道久久综合亚洲精品婷婷| 亚洲一区二区三区中文字幕在线| 亚洲综合成人在线| 久久久久久亚洲精品杨幂换脸| 美女视频黄 久久| 欧美色图首页| 国产一区久久久| 91久久久久久久久| 亚洲一级黄色av| 久久人人爽国产| 亚洲人体偷拍| 亚洲综合第一页| 麻豆精品91| 国产精品乱子久久久久| 狠狠色综合色区| 中日韩男男gay无套| 久久人人看视频| 亚洲免费成人| 久久久国产一区二区| 欧美日韩在线高清| 红桃视频国产精品| 一区二区三区国产盗摄| 久久综合色播五月| 日韩亚洲欧美中文三级| 一区二区三区在线看| 国产在线欧美| 日韩午夜精品| 久久婷婷一区| 一区二区三区 在线观看视| 久久成人18免费网站| 欧美精品一区二区视频 | 小黄鸭视频精品导航| 欧美顶级少妇做爰| 亚洲午夜激情网页| 欧美激情综合色| 伊人狠狠色j香婷婷综合| 亚洲专区一区| 亚洲日本va午夜在线电影| 久久99伊人| 国产精品欧美日韩一区| 夜夜精品视频一区二区| 欧美成人免费观看| 久久av一区二区三区| 国产精品乱码| 亚洲午夜av| 91久久精品一区| 久久久夜夜夜| 国内精品亚洲| 久久精品中文字幕一区二区三区| 日韩一区二区精品葵司在线| 免费人成精品欧美精品| 国内外成人免费激情在线视频 | 亚洲视频专区在线| 亚洲国产欧美在线| 久久夜色精品国产欧美乱| 国产亚洲视频在线| 久久超碰97中文字幕| 亚洲图片在线| 国产精品视频| 亚洲主播在线| 在线亚洲电影| 国产精品久久久久久久午夜片| 亚洲少妇在线| 夜夜精品视频一区二区| 欧美日韩亚洲精品内裤| 亚洲先锋成人| 一本久久综合亚洲鲁鲁| 国产精品成人一区二区三区吃奶| 亚洲一区二区三区成人在线视频精品| 亚洲欧洲一区二区天堂久久| 欧美理论电影在线观看| 一区二区三区 在线观看视| 亚洲精品人人| 国产精品久久久久久久久搜平片 |