2013-07-01 106 views
3

我對python比較陌生,但由於我的母語包含一些令人討厭的變音,所以我不得不跳入編碼在一開始就存在的噩夢。 我閱讀了joelonsoftware的編碼文本,並理解了代碼點與字母實際渲染(以及unicode和編碼之間的連接)之間的區別。 爲了讓我擺脫困境,我發現了3種處理變音符號的方法,但我無法做出決定,哪種適合什麼情況。 如果有人可以擺脫它的一些燈光?我希望能夠寫文本到文件,從它讀取(或sqlite3),併發出文本,所有包括可讀的變音符號... 非常感謝!哪種編碼方法最可靠?

# -*- coding: utf-8 -*- 
import codecs 

# using just u + string 
with open("testutf8.txt", "w") as f: 
    f.write(u"Österreichs Kapitän") 

with open("testutf8.txt", "r") as f: 
    print f.read() 


# using encode/decode 
s = u'Österreichs Kapitän' 
sutf8 = s.encode('UTF-8') 
with open('encode_utf-8.txt', 'w') as f2: 
    f2.write(sutf8) 
with open('encode_utf-8.txt','r') as f2: 
    print f2.read().decode('UTF-8') 


# using codec 
with codecs.open("testcodec.txt", "w","utf-8") as f3: 
    f3.write(u"Österreichs Kapitän") 

with codecs.open("testcodec.txt", "r","utf-8") as f3: 
    print f3.read() 

編輯: 我測試了這個(文件的內容是 '甲必丹Österreichs'):

with codecs.open("testcodec.txt", "r","utf-8") as f3: 

    s= f3.read() 
    print s 
    s= s.replace(u"ä",u"ü") 
    print s 

我必須在我的代碼在任何地方使用u'string」(Unicode)的?我發現,如果我只是使用空白字符串(不帶'u'),替換變音符號不起作用...

回答

4

作爲一般的經驗法則,您通常希望儘早解碼編碼字符串儘可能將其作爲一個unicode對象進行處理,最後儘可能晚地編碼(在將其寫入文件之前)。

所以例如爲:

with codecs.open("testcodec.txt", "r","utf-8") as f3: 
    s = f3.read() 

# modify s here 

with codecs.open("testcodec.txt", "w","utf-8") as f3: 
    f3.write(s) 

至於你的問題,哪種方式是最好的做到這一點:我不認爲這是使用的編解碼器庫或使用手動編碼/解碼之間的差異。這是一個偏好問題,無論是工作。

只要使用open,就像你的第一個例子一樣,python不會嘗試使用默認編解碼器(如果你沒有改變它是ASCII的話)對字符串進行編碼。

關於你是否應該在任何地方使用unicode字符串的問題: 原則上,是的。如果你創建一個字符串s = 'asdf'它有類型str(你可以檢查這與type(s)),如果你做s2 = u'asdf'它有unicode類型。 由於總是操縱unicode對象更好,所以推薦使用後者。

如果你不想總是在字符串前面追加「U」,你可以用下面的導入:

from __future__ import unicode_literals 

然後,你可以做s = 'asdf'和S將有型unicode。在Python3中,這是默認的,所以導入只在Python2中需要。

對於潛在的問題,你可以看看Any gotchas using unicode_literals in Python 2.6?。基本上你不想混用utf-8編碼的字符串和unicode字符串。

+0

非常感謝,這給了我一些見解......張貼代碼不工作的意見? – Mike

+0

您可以點擊評論欄旁邊的「幫助」按鈕來了解接受的語法(他們稱之爲mini-Markdown)。註釋中的代碼應該包含反引號(')。 – rkrzr

+0

謝謝。我是否必須寫 'u「österreich」'以便能夠工作,例如:替換字母?請參閱我的編輯問題的整個例子... – Mike