2012-03-06 96 views
2

我有一個Django應用程序處理從Google導入的數據(通過gdata api)的問題。基本上,從Google導入的每個文本都會在我的頁面上顯示編碼問題(例如:'CearáState'顯示爲'CearáState')。Django和MySql - 編碼困難

MySQL數據庫上的enconding設置爲UFT-8和所有的文本都在我的查詢正確顯示,但事情開始變得有點怪異我做了一些嘗試用Django的後殼:

我已經改變了這些文本由手之一,現在它顯示在頁面上沒有編碼的問題,而是由外殼呼應的文本仍然類似於編碼問題的:

>>> v1 
<Video: São Paulo is awesome!> 
>>> v1.title 
u'S\xe3o Paulo is awesome!' 
>>> v2 
<Video: Ceará State> 
>>> v2.title 
u'Cear\xc3\xa1 State' 

如果我嘗試打印正文:

print v1.title 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 1: ordinal not in range(128) 

有什麼想法發生了什麼,我該如何解決它?謝謝。

編輯:

我寫了一個很愚蠢的函數來處理我的問題,而有沒有更好的解決辦法:

def normalize(s): 
    return s.encode('utf-8').replace('á', 'á').replace('ó', 'ó').replace('ç', 'ç').replace('ã', 'ã').replace('Ã', 'í') 

EDIT 2: 

問題是由阿帕奇造成這是不是設置爲使用UFT- 8。

+1

我覺得你的shell不支持這些編碼,你有沒有顯示在模板這個數據? – Ahsan 2012-03-06 18:01:40

+0

Ahsan - 是的。我用手修改了重音的標題正確顯示,而其他人用替換重音符的奇怪字符搞亂了。 – Raphael 2012-03-06 18:05:48

+0

@Ahsan - 請注意,v1在shell上的unicode表示是正確的: <視頻:聖保羅真棒!>和v2的unicode表示形式變混淆了:<視頻:Ceará狀態> – Raphael 2012-03-06 18:35:33

回答

1

如果我理解你正確你得到錯誤,而打印在外殼標題所以儘量以此爲

print v1.title.encode('utf-8') 
+0

我的錯誤不是隻在殼中。該文本也在我的模板上顯示錯誤。我試過這個功能,但它更讓我的字符串搞砸了。 – Raphael 2012-03-06 18:39:05

+0

我正在處理一個非常愚蠢的函數來處理我的問題:def normalize(s): return s.encode('utf-8')。replace('Ã''''')。replace('³ '''')。replace('ç','ç')。replace('Ã'','ã')。replace('Ã','í') – Raphael 2012-03-06 19:07:29

+0

如果google api返回的不是這些角色,這不適合那些人。如果你忽略這些非ascii字符,比如'',這將是'A'等,可能會有解決方案。 – Ahsan 2012-03-06 19:35:46