2010-01-05 88 views
1

我真的迷失在所有使用Python的編碼/解碼問題中。閱讀了很少的關於如何完美處理傳入的文檔,我仍然遇到像韓文這樣的幾種語言的問題。無論如何,這是我正在做的。Python編碼問題

korean_text = korean_text.encode('utf-8', 'ignore') 
korean_text = unicode(korean_text, 'utf-8') 

我把上面的數據保存到數據庫,經過很好。

後來,當我需要顯示的數據,我取從數據庫的內容,並執行以下操作:

korean_text = korean_text.encode('utf-8') 
print korean_text 

和所有我看到的是「???」在瀏覽器上回應。有人可以讓我知道什麼是正確的方式來保存和顯示上述數據。

感謝

+0

第二個'encode'應該是'decode'嗎? – miku 2010-01-05 12:59:12

+0

您是否安裝了必要的字體? – Kugel 2010-01-05 13:00:08

+0

你是否聲明你的輸出是用UTF-8編碼的? – Gumbo 2010-01-05 13:04:25

回答

8

即使已經看了一些文檔,你似乎是如何統一的作品困惑。

  • Unicode不是編碼。 Unicode是沒有編碼。
  • utf-8不是unicode。 utf-8是一種編碼。
  • 解碼 utf-8字節串來獲取unicode。你編碼 unicode使用編碼,比如utf-8來獲得一個編碼字節串。
  • 只有字節串可以保存到磁盤,數據庫,或在網絡上發送,或打印在打印機或屏幕上。 Unicode只存在於你的代碼中。

最好的做法是儘早解碼所有你想要的東西,在你的所有代碼中將它解碼爲unicode,然後儘可能晚地編碼它,當文本準備離開你的時候程序,屏幕,數據庫或網絡。


現在對於你的問題:

如果您有從瀏覽器傳來的文字,比如,從一種形式,然後進行編碼。它是一個字節串。它不是unicode。

然後你必須解碼才能得到unicode。使用瀏覽器用於編碼的編碼對其進行解碼。正確的編碼來自瀏覽器本身,位於正確的HTTP REQUEST標頭中。

解碼時不要使用'ignore'。由於瀏覽器說明了它使用的是哪種編碼,因此不應該出現任何錯誤。使用'ignore'表示如果有錯誤,您將隱藏一個錯誤。

也許你的web框架的選擇已經做到了。我知道django,pylons,werkzeug,cherrypy都可以做到這一點。在這種情況下,你已經得到了unicode。

現在你已經有了一個解碼的Unicode字符串,你可以使用任何你喜歡存儲在數據庫上的編碼來編碼它。 utf-8是一個不錯的選擇,因爲它可以編碼所有的unicode碼點。

當您從數據庫中檢索數據時,使用您用於存儲數據的相同編碼對其進行解碼。然後使用您想要在頁面上使用的編碼進行編碼 - 在html元首標頭<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>中聲明的編碼。如果上一步使用的編碼相同,則可以跳過解碼/重新編碼,因爲它已經用utf-8編碼。

如果您看到???,那麼在上述任何步驟中數據都將丟失。準確地說,需要更多信息。

+2

+1可惜這是一個咖啡杯打印太長。 – 2010-01-05 14:06:22

+0

nokklo,謝謝你的迴應。這就是我正在做的 - 我得到的是使用feedparser從以下URL獲取RSS提要 - http://rixk.com。在經過上面的詳細解釋之後,我使用feedparser文檔進行了檢查,它說每個元素值都以Python Unicode字符串的形式返回(有一些例外 - http://www.feedparser.org/docs/introduction.html) 。現在因爲數據已經是Unicode了,按照你上面的解釋,我不應該真正編碼它,而是一直使用unicode字符串,直到在提交數據庫之前。是對的嗎? – vivpuri 2010-01-05 15:03:37

+0

*現在因爲數據已經是Unicode了,按照你上面的解釋,我不應該真的在早期對它進行編碼* - > Typo:你應該說「我不應該早**解碼**」 - 因爲它已經被解碼(unicode)。它正在被feedparser本身儘早解碼!你應該在發送到數據庫之前對它進行編碼。 – nosklo 2010-01-05 15:10:58

0

通過this post瞭解如何在Python中處理Unicode。

你基本上想要做這些事情:

.encode() text to a particular encoding (such as utf-8) before sending it to the database. 
.decode() text back to unicode (from your encoding) when reading it from the database 
0

問題是肯定(尤其是如果其他非ASCII字符顯示工作正常),您的瀏覽器或操作系統不具備適當的字體顯示韓文文本,或者瀏覽器使用的默認字體不支持韓文。嘗試選擇另一種字體,直到它工作。