Re: [問題] 請問一下unicode的問題
※ 引述《theodolite (無)》之銘言:
: ※ 引述《theodolite (無)》之銘言:
: : 不好意思,小弟又來問問題了,
: : 我用gtk selectionData.get_text()抓到一串中文字,像"所有網站"
: : 這樣的字串會回傳'\u6240\u6709\u7db2\u7ad9'
: : 長度為24的ascii字串,
: : 像這樣的情形,要如何把一個ascii字串轉成unicode字串?
: : 不論是用decode或是unicode這兩個function似乎還沒試出可行的方法。
: 自問自答,我用最笨的方法,split \u,抓出來的再用unichr轉成unicode string
: 如果有更好的解法也請指教,謝謝。
這方法有效,不過太苦。
Python 提供 codec 架構進行字碼轉換,2.3 以後都支援
(更早的版本可能也有,抱歉我不確定)。
在利用 codec 架構進行字碼轉換之前,
我們要對 Python 提供的唯二字串物件 str 和 unicode 其間的關係,
具有基本的概念。
unicode 存的是 Unicode code point,而 str 可以存任意的 byte list。
在處理字碼轉換時,概念上要把 unicode 物件當成一種與字碼無關的字串型別,
從 unicode 物件「編碼」成代表各種字碼的 str 物件,
或從以任意字碼表示的 str 物件「解碼」回 unicode 物件。
具體來講,假設我們取得的「所有網站」字串是以 utf-8 編碼,
而我們想把它轉成 unicode 物件,那要這樣作:
uniraw = raw.decode('utf8') # raw contain 所有網站 in UTF-8 encoding.
這樣得到的 uniraw 會是一個 unicode 物件。
再舉一個在 CP950 Windows 下的例子,用 interactive mode Python:
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print type( "所有網站".decode("big5") ) ; print "所有網站".decode("big5")
<type 'unicode'>
所有網站
>>> print type( "所有網站" ) ; print "所有網站"
<type 'str'>
所有網站
>>>
好了,當我們得到一個 unicode 字串之後,想轉成哪種編碼都可以隨心所欲:
sjisraw = uniraw.encode("sjis")
再用 interactive Python 示範一下:
>>> print "所有網站".decode("big5").encode("sjis")
?⑫簛?
>>>
在 CP950 下出亂碼是正常的;不出亂碼表示我們寫錯了。
有時候在一些處理字串的程式裡我們還會看到如下的 traceback:
>>> print "所有網站".decode("big5").encode("ascii")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordin
al not in range(128)
>>>
很明顯,ascii encoding 不可能包含「所有網站」的碼域。
在把 str (in Big5) 的「所有網站」解碼成 unicode 時不會出問題,
但如果要把 unicode 的「所有網站」編碼成 ascii,這是件不可能的任務,
Python 就爆給我們看。
這是應當的,也是合理的,Python 如此行,乃是理所當然的。
如果能弄懂以上的操作,應該就可以掌握 Python 的 unicode 處理了。
當然,實作的時候還有一些要注意的地方。
第一是 Python 的 codec 名稱及所支援的 encoding;
尤其 Python 在 2.4 之前是「不支援」Big5 的,要另行安裝 cjkcodecs 套件
(感謝韓國人)。
第二是在 interactive mode 中使用 Python 時,要注意終端機的 locale
(在 Windows 下就是 codepage);
locale 不正確,即使編解碼正確,出亂碼也是好正常的了。
--
寫完才覺得自己廢話真多。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.8
推
12/17 16:48, , 1F
12/17 16:48, 1F
推
12/18 07:49, , 2F
12/18 07:49, 2F
推
12/23 13:57, , 3F
12/23 13:57, 3F
推
08/08 18:14, , 4F
08/08 18:14, 4F
討論串 (同標題文章)
Python 近期熱門文章
PTT數位生活區 即時熱門文章