2012-07-19 49 views
1

這是我一直堅持的編碼問題幾個星期的第二次。我已經在這個問題上花了很長時間了,我希望能得到任何幫助。的Unicode在Django的網站

這就是我想做的事:

1)在我的電腦上選擇從MySQL表中的一些行。

2)寫這些行到一個文本文件中。

3)將文本文件傳輸到我的Amazon EC2 Ubuntu實例。

4)寫文本文件的內容到一個MySQL數據庫。

5)讓Django從#4中的數據庫中選擇一些行。在網站上

6)顯示。

在#1,我只是一個普通的SELECT語句。 在#2,我這樣做:

file = codecs.open('commentsfordjango.txt', encoding = 'utf-8', mode='w') 
file.write(fullcomment.decode('utf8') + '\n\n\n\n\n\n') 

第2步後,我在Windows中打開.txt文件,我可以看到所有的實際中國人物沒有任何錯誤。

在步驟#3中,我只是使用WinSCP傳輸文件。 在步驟#4中,我這樣做:

file = open('/usr/local/src/blog/commentsfordjango.txt', 'r') 
cursor.execute("INSERT INTO polls_poll (commenttext, pos, neu, neg) VALUES (%s, 0, 0, 0)", line) 

在步驟#5中,我在views.py這樣做:我簡單地返回其對應於模型中的對象。我的模型有一個unicode函數,但我沒有調用它,因爲我默認讀取它時,它已在調用您的對象時調用。

在#6,我的HTML文件,在該文件的頂部以下行:

<meta charset="utf-8" /> 

而且,我改變了我的Apache默認編碼爲Unicode。我還確保第4步中的SQL數據庫使用Unicode。

然而,這一切後,我的網站還顯示了一堆不可讀的,奇怪的字符,例如:人在åšï¼Œå¤©åœ¨çœ

任何幫助將非常感謝 - 我已經嘗試了很多涉及.decode()和.encode('utf-8')的變體,並且已經在這個問題上花了很長時間了!

+0

你實際上想寫入.encode()。爲什麼在一個位置使用codecs.open()而不是其他位置? – monkut 2012-07-19 03:34:46

+0

「另外,我將我的apache編碼默認值更改爲unicode」 - 這是無意義的,unicode不是一種編碼。 – 2012-07-19 03:40:12

+0

當您打開該文件進行檢查時,是否確保使用正確的字符集進行保存? – 2012-07-19 05:14:59

回答

1

在第2步,你應該給你的文字編碼爲UTF-8。

with open("commentsfordjango.txt", "wb") as f: 
    f.write(fullcomment.encode('utf8')) 

在步驟3中,您可以將從文件中讀取的數據解碼回unicode。

with open("commentsfordjango.txt", "rb") as f: 
    for line in f.read().decode("utf-8").splitlines(): 
     cursor.execute("INSERT INTO polls_poll (commenttext, pos, neu, neg) VALUES (%s, 0, 0, 0)", line) 

更好的解決方案是隻使用Django的內置loaddata/dumpdata設施。

+0

我意識到它是一個Django問題。如果我在步驟5中不使用Django,而是創建一個新的python文件來選擇行,然後將它們與和標記一起寫入.html文件,它工作得很好。 Django爲我檢索對象的方式會有些什麼嗎? – 2012-07-20 01:45:37

0

問題的一大部分可能是你手動插入項目到數據庫,而不是使用Django的數據庫ORM。ORM負責所有的編碼/解碼,確保你從數據庫中獲得好的unicode,無論數據庫本身使用什麼編碼。

所以:你真的確定你在數據庫中插入正確的編碼嗎?你應該用ORM做一個快速測試。確保你使用codecs.open()(你似乎在做的)正確的方式讀取文件,並將其填入django模型並保存。

+0

我意識到它是一個Django問題。如果我在步驟5中不使用Django,而是創建一個新的python文件來選擇行,然後將它們與和標記一起寫入.html文件,它工作得很好。 Django爲我檢索對象的方式會有些什麼嗎? – 2012-07-20 01:49:41

+0

Django遇到了* *的問題:-)您使用Django從數據庫中檢索數據,但您自己手動輸入數據。 Django爲你的數據庫做適當的unicode編碼/解碼。但是你可能用你的手動插入來輸入錯誤的東西。當您再次手動將其取出時,它會起作用(因爲您的操作方式與放入時相同)。如果您使用django插入數據並重新取出,那也可以。 – 2012-07-20 08:31:32