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

我希望你是我獨家記憶

一段永遠封存的記憶,隨風而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

[轉載] python中文編碼問題

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

Unicode 是一個系統,用來表示世界上所有不同語言的字符。當 Python 解析一個 XML 文檔時,所有的數據都是以unicode的形式保存在內存中的。

一會兒你就會了解,但首先,先看一些背景知識。

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

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

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

在 處理 unicode 數據時,在某些地方你可能需要將數據轉換回這些遺留編碼系統之一。例如,為了同其它一些計算機系統集成,這些系統期望它的數據使用一種特定的單字節編碼模 式,或將數據打印輸出到一個不識別 unicode 的終端或打印機。或將數據保存到一個明確指定編碼模式的 XML 文檔中。

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

從 2.0 版開始,Python 整個語言都已經支持 unicode。XML 包使用 unicode 來保存所有解析了的 XML 數據,而且你可以在任何地方使用 unicode。

例 9.13. unicode 介紹

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

例 9.14. 存儲非 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 真正的優勢,理所當然的是它保存非 ASCII 字符的能力,例如西班牙語的 “ñ”(n 上帶有一個波浪線)。用來表示波浪線 n 的 unicode 字符編碼是十六進制的 0xf1 (十進制的241),你可以像這樣輸入:\xf1
2 還記得我說過 print 函數會嘗試將 unicode 字符串轉換為 ASCII 從而打印它嗎?嗯,在這里將不會起作用,因為你的 unicode 字符串包含非 ASCII 字符,所以 Python 會引發 UnicodeError 異常。
3 這兒就是將 unicode 轉換為其它編碼模式起作用的地方。s 是一個 unicode 字符串,但 print 只能打印正常的字符串。為了解決這個問題,我們調用 encode 方法 (它可以用于每個 unicode 字符串) 將 unicode 字符串轉換為指定編碼模式的正常字符串。我們向此函數傳入一個參數。在本例中,我們使用 latin-1 (也叫 iso-8859-1),它包括帶波浪線的 n (然而缺省的 ASCII 編碼模式不包括,因為它只包含數值從 0 到 127 的字符)。

還記得我說過:需要從一個 unicode 得到一個正常字符串時,Python 通常默認將 unicode 轉換成 ASCII 嗎?嗯,這個默認編碼模式是一個可以定制的選項。

例 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 是一個特殊的腳本;Python 會在啟動的時候導入它,所以在其中的任何代碼都將自動運行。就像注解中提到的那樣,它可以放在任何地方 (只要 import 能夠找到它),但是通常它位于 Pythonlib 目錄的 site-packages 目錄中。
2 嗯,setdefaultencoding 函數設置默認編碼。Python 會在任何需要將 unicode 字符串自動轉換為正規字符串的地方,使用這個編碼模式。

例 9.16. 設置默認編碼的效果

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

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

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

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

現在,想想 XML 中的編碼應該是怎樣的呢?不錯,每一個 XML 文檔都有指定的編碼。重復一下,ISO-8859-1 是西歐語言存放數據的流行編碼方式。KOI8-R 是俄語流行的編碼方式。編碼――如果指定了的話――都在 XML 文檔的首部。

例 9.18. russiansample.xml


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

例 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 我假設在這里你將前一個例子以 russiansample.xml 為名保存在當前目錄中。也出于完整性的考慮,我假設你已經刪除了 sitecustomize.py 文件,將缺省編碼改回到 'ascii',或至少將 setdefaultencoding 一行注釋起來了。
2 注意 title 標記 (現在在 title 變量中,上面那一長串 Python 函數我們暫且跳過,下一節再解釋)――在 XML 文檔的 title 元素中的文本數據是以 unicode 保存的。
3 直接打印 title 是不可能的,因為這個 unicode 字符串包含了非 ASCII 字符,所以 Python 不能把它轉換為 ASCII,因為它無法理解。
4 但是,你能夠顯式地將它轉換為 koi8-r,在本例中,我們得到一個 (正常,非 unicode) 單字節字符的字符串 (f0, d2, c5,等等),它是初始unicode字符串中字符 koi8-r 編碼的版本。
5 打印 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 已經準備好了。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品久久久久久久久久久久久| 另类天堂av| 99re热精品| 欧美国产一区二区在线观看| 尤物在线精品| 欧美激情视频给我| 欧美国产精品久久| 在线亚洲+欧美+日本专区| 亚洲免费观看| 国产精品永久免费在线| 欧美制服丝袜第一页| 欧美在线播放一区| 影音先锋日韩资源| 91久久精品美女| 欧美日韩国产综合视频在线观看中文| 在线综合视频| 午夜在线电影亚洲一区| 伊人狠狠色j香婷婷综合| 亚洲第一福利视频| 欧美日韩一区在线观看视频| 性感少妇一区| 美女91精品| 先锋影音国产一区| 久热国产精品视频| 国产精品99久久久久久宅男| 亚洲综合精品一区二区| 亚洲成人资源| 亚洲天堂男人| 亚洲精品视频在线观看网站| 亚洲午夜高清视频| 亚洲第一二三四五区| 一区二区欧美亚洲| 在线观看日韩专区| 亚洲一区二区免费看| 亚洲激情综合| 香蕉久久一区二区不卡无毒影院| 亚洲日韩第九十九页| 性做久久久久久| 日韩一区二区精品视频| 欧美一级电影久久| 亚洲自拍高清| 欧美激情一二三区| 久久综合网hezyo| 国产精品日韩在线观看| 亚洲精品免费在线| 极品尤物久久久av免费看| 国产精品99久久久久久白浆小说| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲在线免费| 午夜精品久久久久久久久久久| 免费91麻豆精品国产自产在线观看| 欧美一区二区久久久| 欧美视频免费在线| 亚洲精品乱码| 亚洲美女精品成人在线视频| 久久婷婷av| 久久这里只有| 影音先锋另类| 久久精品亚洲一区二区| 久久精品国产亚洲精品| 国产精品一区二区三区久久| 一区二区三区视频观看| 夜夜嗨一区二区三区| 欧美激情一区二区久久久| 欧美大尺度在线观看| 在线观看视频一区二区欧美日韩| 欧美在线精品免播放器视频| 欧美一级久久| 国产午夜精品理论片a级大结局| 亚洲综合精品| 久久精品在线视频| 国语自产精品视频在线看抢先版结局| 亚洲欧美日韩一区二区三区在线观看| 亚洲免费一区二区| 国产精品午夜av在线| 亚洲欧美日韩精品久久久| 欧美亚洲视频一区二区| 国产精品一级| 久久精品国产精品亚洲综合| 蜜臀va亚洲va欧美va天堂| 精品成人在线观看| 欧美成人自拍| 一本色道**综合亚洲精品蜜桃冫 | 欧美午夜电影在线| 一区二区三区福利| 欧美在线视频在线播放完整版免费观看| 国产精品看片你懂得| 午夜精品一区二区三区电影天堂| 久久久久国产精品人| 在线不卡免费欧美| 欧美日韩国产一区精品一区| 在线视频欧美一区| 久久综合久久久久88| 亚洲精品乱码久久久久久按摩观 | 久久婷婷国产麻豆91天堂| 亚洲国产精品成人| 午夜欧美电影在线观看| 一区在线观看| 欧美日韩在线大尺度| 久久av红桃一区二区小说| 亚洲电影免费观看高清完整版| 一区二区三区高清视频在线观看| 国产日韩欧美在线| 欧美黄色日本| 久久福利毛片| 一级日韩一区在线观看| 久久久午夜视频| 国产精品99久久久久久www| 国产一区二区无遮挡| 欧美人妖在线观看| 久久久精品性| 亚洲一区二区三区免费观看 | 尤物在线观看一区| 欧美午夜性色大片在线观看| 欧美在线免费视频| 亚洲视频欧美在线| 欧美激情成人在线| 久久久噜噜噜久噜久久| 在线一区亚洲| 亚洲精品三级| 影音先锋久久| 国产亚洲日本欧美韩国| 欧美视频不卡中文| 欧美成人乱码一区二区三区| 欧美中文在线视频| 亚洲素人一区二区| aa级大片欧美三级| 亚洲黄色成人| 亚洲高清精品中出| 欧美va亚洲va国产综合| 久久久久久高潮国产精品视| 午夜精品美女久久久久av福利| 亚洲麻豆国产自偷在线| 在线视频国内自拍亚洲视频| 国产手机视频一区二区| 国产精品麻豆欧美日韩ww| 欧美日韩午夜视频在线观看| 欧美电影美腿模特1979在线看 | 日韩午夜激情| 亚洲日本免费| 亚洲毛片在线看| 亚洲精品欧美极品| 欧美国产日韩在线| 欧美激情1区| 亚洲国产mv| 亚洲黄色av| 亚洲精品一区二区三| 亚洲精品无人区| 亚洲麻豆一区| 亚洲社区在线观看| 亚洲一区二区三区在线播放| 亚洲无吗在线| 亚洲综合色视频| 久久www免费人成看片高清 | 欧美成人一区二区三区在线观看| 久久野战av| 欧美黄色片免费观看| 亚洲国产精品一区二区www在线| 亚洲电影在线观看| 亚洲第一色在线| 99国产精品自拍| 亚洲欧美激情视频| 久久精彩视频| 欧美成人午夜剧场免费观看| 欧美日韩亚洲一区| 国产亚洲精久久久久久| 在线欧美小视频| 中文亚洲字幕| 久久精品av麻豆的观看方式 | 午夜精品久久久久久久| 欧美一区二区黄色| 欧美xxxx在线观看| 日韩网站免费观看| 午夜精品久久久久久久久久久久久 | 亚洲自拍16p| 久久精品人人做人人综合 | 篠田优中文在线播放第一区| 久久精品久久综合| 欧美精品日韩一本| 国产欧美激情| 亚洲精品中文字幕在线| 午夜免费电影一区在线观看| 久久影院午夜片一区| 亚洲黄色在线看| 性欧美办公室18xxxxhd| 欧美电影在线观看完整版| 国产精品乱码久久久久久| 亚洲国产精品成人久久综合一区| 亚洲午夜视频在线观看| 老司机免费视频一区二区| 一本久久综合| 欧美成人久久| 国产一区二区三区免费在线观看| 日韩性生活视频| 乱码第一页成人| 亚洲欧美国产高清va在线播| 欧美激情视频一区二区三区免费| 国产一区二区日韩精品欧美精品| 一区二区三区免费看| 欧美成人69av|