2012-01-13 147 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