2012-01-13 111 views
0

我有一個奇怪的編碼問題從我的PyQt應用程序到我的mysql數據庫。 我的意思是奇怪的,它在一種情況下工作,而不是在其他情況下,儘管我似乎對所有人都做了完全相同的事情。python和mysql之間的編碼問題

我的過程是這樣的:

我有我寫的可能含有的口音和東西(E,A,E,...)

我得到書面文本的文字有些QFocusOutTextEdit元素:

text = self.ui.text_area.toPlainText() 
    text = text.toUtf8() 

然後將其插入到我的數據庫我做的:

text= str(text).decode('unicode_escape').encode('iso8859-1').decode('utf8') 

我還將我的數據庫的字符集,特定的表和表的特定列設置爲utf8。

它正在爲我的文本區域工作,對於其他人而言,它將奇怪的字符放在我的數據庫中。

任何提示讚賞!

已解決: 對於這種干擾感到抱歉,顯然我的數據庫中有一些字段並不是最新的,這阻止了編碼過程。

+0

WOW。編碼爲UTF-8,然後再次解碼並重新編碼,然後再次解碼?也許你最好解釋一下所有這些應用意味着什麼!你不應該能夠簡化這個**一個LOT **嗎? – Celada 2012-01-13 09:30:34

+0

是的,我知道它對我來說也很奇怪。我在一些論壇上看到了這個解決方案,並且出於某種原因,它的工作原理。所以我沒有看得更遠,對編碼問題我不太瞭解。如果你有一個更簡單的解決方案,我會接受它! – Johanna 2012-01-13 09:34:37

+0

你如何將它插入數據庫? – golimar 2012-01-13 09:48:49

回答

2

即使您知道它的全部含義,您仍然在進行大量的編碼,解碼和重新編碼,這些都很難遵循。你應該試着簡化它,直到使用Unicode字符串本地工作。在Python 3中,表示str(正常字符串),在Python 2中表示unicodeu"this kind of string")。

安排連接到MySQL數據庫以在輸入和輸出上使用Unicode。如果你使用像Sqlalchemy這樣的高層次,你可能不需要做任何事情。如果您直接使用MySQLdb,請確保您將charset="UTF8"(這意味着use_unicode)傳遞給connect()方法。

然後確保您從PyQT獲得的值是一個unicode值。我不知道PyQT。檢查self.ui.text_areaself.ui.text_area.toPlainText()的類型。希望它已經是一個Unicode字符串。如果是的話,你就全部設置好了。如果不是:這是一個可能用UTF-8編碼的字節字符串,所以你可以用theresult.decode('utf8')來解碼它,它會給你一個Unicode對象。

一旦你的代碼處理所有的Unicode對象,沒有更多的編碼字節串,你不需要做任何編碼或解碼了。只需將字符串從PyQT直接傳遞給MySQL即可。

+0

感謝您的提示!我暫時解決了我的問題,但這有點複雜,我不得不承認這一點。我會盡快嘗試你的解決方案! – Johanna 2012-01-13 13:35:41

+0

太棒了!我添加了這行'self.conn。set_character_set('utf8')'到我的連接類,停止解碼編碼解碼部分,它似乎工作 – Johanna 2012-01-13 15:36:34