2013-08-27 67 views
3

在python中編寫unicode程序有哪些一般指導< = 2.7?是否習慣於在每個字符串前添加u,即使它不包含ASCII範圍之外的任何字符?在Python中編寫unicode程序<= 2.7

在處理sqlite3時,參數化查詢會自動將unicode編碼爲utf-8,還是需要手動完成?

當處理字符串的字符串時,它應該保留爲字符串對象還是解碼爲unicode字符串? (我相信這會在大多數情況下拋出異常)

如果由於任何原因,我需要在代碼中使用字符unicode字符,只要它是一個unicode字符串,我就可以在字符串中使用該字符,並且我有我的編碼在文件的頂部聲明?

編輯:當打印一個unicode字符串時,如何獲取用戶系統的區域設置,以便我可以正確編碼它?盲目地將一切編碼爲utf-8似乎是一個糟糕的主意,因爲並非所有的系統都支持它。編輯:我相信我想出了這一個。它可以使用語言環境

import locale 
encoding = locale.getpreferredencoding() 

編輯:這種編碼實際上是隱式地完成的嗎?現在我很困惑。在Linux上,我能做到這一點

s = u'\u2c60' 
print s # prints Ⱡ 
print s.encode('utf-8') # prints Ⱡ 

但在Windows出現這種情況

s = u'\u2c60' 
print s # prints Ⱡ in IDLE, UnicodeEncodeError in cmd 
print s.encode('cp1252') # UnicodeEncodeError 
print s.encode('utf-8') # prints â± 
print s.encode('cp1252', 'replace') # prints ? 

它似乎像印刷確實隱含轉換...

編輯:這個問題說,打印將自動編碼存儲在sys.stdout.encoding Why Does Python print unicode characters when the default encoding is ASCII?

現在我想知道,有沒有辦法使默認行爲或打印來取代不可編碼的字符?或者我需要包裝印刷在我自己的函數,是這樣的:

def myPrint(msg): 
    print msg.encode(sys.stdout.encoding, 'replace') 

我知道這些問題大部分都在Python 3已經解決,但我想支持蟒蛇< = 2.7。

+3

http://nedbatchelder.com/text/unipain.html –

+0

Python 2支持Unicode與Python 3一樣,主要是;使用'io.open()'(或'from future_builtins import open')來使用與Python 3相同的文件I/O。解碼並在邊緣編碼(在輸入時解碼,在輸出時編碼)就像Python 3,在其他地方將文本視爲unicode。 –

回答

1

是否優先考慮每個字符串與u,即使它不包含在ASCII範圍以外的任何字符?

是的,還使用一個與unicode一起工作的編輯器,並在每個文件的頂部聲明編碼類型。

一般來說,您的模式應該是:讀取字節,內部使用unicode,輸出字節。

在處理sqlite3時,參數化查詢會自動將unicode編碼爲utf-8,還是需要手動完成?

更好的是比抱歉安全,但總的來說,我建議你自己測試一下。

當一個字節的「串」打交道,這應該留下作爲一個字符串對象或解碼成Unicode字符串? (我相信這會扔在大多數情況下除外)

是,使用Unicode內部工作。不,如果你真的知道編碼,這不會拋出異常。你應該知道編碼。確保你知道編碼。

如果出於任何原因,我需要在代碼中使用文字Unicode字符,我可以只使用該字符的字符串,只要它是一個unicode字符串和我在的頂部聲明我的編碼文件?

是的,只要你的編輯器是unicode友好的。