2012-01-13 10 views
0

私のPyQtアプリケーションから私のmysqlデータベースに変なエンコーディングの問題があります。 私は全く同じことをしているように見えるが、あるケースでは動作し、他のケースでは動作しないという意味では奇妙なことを意味する。私はおそらくアクセントとか(E、A、E、...)私はと書かれたテキストを取得pythonとmysqlの間のエンコードの問題

を含むテキストを記述したいくつかのQFocusOutTextEdit要素を持っている

私のプロセスは以下のとおりです。 :

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

その後、私は私のデータベースに挿入する:

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

私のデータベースの文字セット、特定のテーブル、およびテーブルの特定の列をutf8に設定しました。

私のテキスト領域では動作していますが、他の領域ではdbではなく奇妙な文字が表示されます。

これについて何かヒントをいただきました!

解決済み: 申し訳ありませんが、私のデータベースには最新のものではないフィールドがいくつかありましたが、これは何とかエンコードのプロセスをブロックしていました。

+0

WOW。 UTF-8にエンコードしてから再度デコードし、再びエンコードしてからデコードしますか?たぶんあなたは、そのすべてが意味すると思われるものを説明するほうがいいでしょう。あなたはこれを簡単にすることはできません**多く**? – Celada

+0

ええ、私はそれも私に奇妙に見えた。私はいくつかのフォーラムでこの解決策を見ましたが、何らかの理由で動作します。私はそれ以上見ていませんでした。私はエンコードの問題をあまり理解していません。あなたがより簡単な解決策を持っているなら、私はそれを取るでしょう! – Johanna

+0

どのようにデータベースに挿入しますか? – golimar

答えて

2

エンコード、デコード、および再エンコードを大量に実行していますが、その意味が分かっていても、フォローするのは難しいです。これをシンプルにして、Unicode文字列でネイティブに作業するだけです。 Python 3ではstr(通常の文字列)を意味し、Python 2ではunicodeu"this kind of string")を意味します。

MySQLデータベースへの接続を、入力と出力でUnicodeを使用するように調整します。 Sqlalchemyのような高レベルのものを使用する場合、おそらく何もする必要はありません。 MySQLdbを直接使用する場合はメソッドにcharset="UTF8"(これはuse_unicodeを意味します)を渡すようにしてください。

次に、PyQTから取得している値がユニコード値であることを確認してください。私はPyQTを知らない。 self.ui.text_areaまたはself.ui.text_area.toPlainText()のタイプを確認してください。うまくいけば、それはすでにUnicode文字列です。はいの場合:すべて設定されています。そうでなければ、おそらくUTF-8でエンコードされたバイト文字列なので、Unicodeオブジェクトを与えるtheresult.decode('utf8')でデコードすることができます。

コードですべてのUnicodeオブジェクトとエンコードされたバイト文字列が処理されていない場合は、これ以上エンコードやデコードを行う必要はありません。文字列をPyQTからMySQLに直接渡してください。

+0

チップをありがとう!私は一時的に私の問題を解決しましたが、それはちょっと複雑です。私はそれを認めなければなりません。私はしばらくするとすぐにあなたのソリューションを試してみましょう! – Johanna

+0

素晴らしい!私はこの行 'self.connを追加しました。set_character_set( 'utf8') 'を接続クラスに追加し、デコードエンコードデコード部分を停止しました。 – Johanna