2012-11-07 10 views
6

私はmysqlでデータベースを作成し、webpyを使って自分のWebサーバーを構築します。Webpyを使用すると中国語が文字化けするのはなぜですか?しかし、MySQLdbを使用すると正常ですか?

しかし、WebpyとMySQLdbの動作の間には、データベースにアクセスする際に漢字がそれぞれ奇妙です。

私のテーブルt_test(UTF8のdatabse):

id  name 
1  测试 

"测试" のUTF8コードは次のとおりです。以下は

は私の問題であるXE6 \ XB5 \ x8b \ xe8 \ \ \ X95

XAF

行うためのMySQLdbを使用している場合、このように "選択":

c=conn.cursor() 
    c.execute("SELECT * FROM t_test") 
    items = c.fetchall() 
    c.close() 
    print "items=%s, name=%s"%(eval_items, eval_items[1]) 

結果が正常であるが、それは出力します。

items=(127L, '\xe6\xb5\x8b\xe8\xaf\x95'), name=测试 

しかし、私はwebpyが同じことを行う使用する場合:

db = web.database(dbn='mysql', host="127.0.0.1", 
      user='test', pw='test', db='db_test', charset="utf8") 
    eval_items=db.select('t_test') 
    comment=eval_items[0].name 
    print "comment code=%s"%repr(comment) 
    print "comment=%s"%comment.encode("utf8") 

中国の文字化けが発生し、印刷結果は次のとおりです。私はwebpyのデータベースものMySQLdbに依存している

comment code=u'\xe6\xb5\u2039\xe8\xaf\u2022' 
    comment=忙碌鈥姑€ 

知っています、しかし、これらの2つの方法ではとても異なっています。どうして?

上記の理由から、私はちょうど私の中国語の文字化けの問題を解決するために直接MySQLdbを使用することができますが、それはテーブルのclolumnの名前を失う - それは非常に恥ずかしいです。私はどのように私がそれをwebpyで解決できるのか知りたいですか?

+2

実際、検索する文字列はゴミだけに見えます。 datbaseのデータがutf-8でエンコードされていない可能性がありますか?どのようにそこに記録されたのですか? – jsbueno

+0

私のデータベースのデータもutf-8であると確信しています。 Navicatを使ってmysqlテーブルをチェックし、 "测试"の16進コードはE6B5 8BE8 AF95です。また、UtraEditを使用してこれを確認することもできます。 @jsbueno – eason

+0

関連性があるかどうかわかりませんが、文字化けした文字列を印刷すると次のようになります。http://codepad.org/o3DgYhxr、æμ<试の代わりに忙碌姑。どこに文字列を印刷していますか? –

答えて

1

確かに、何か非常に間違っている - あなたのコメントに言ったように、ユニコードrepr。

>>> d 
'\xe6\xb5\x8b\xe8\xaf\x95' 
>>> print d 
测试 

しかし、あなたの "コメント" Unicodeオブジェクトにバイトを見て:

comment code=u'\xe6\xb5\u2039\xe8\xaf\u2022' 

意味一部 ここに私のUTF-8端末上で動作します - "测试" のバイトE6B5 8BE8 AF95ですあなたの内容のコメント にUTF-8バイト(Unicodeでエンコードされている「\のXYY」と一部として表現文字)は\ uYYYYで表さ (charesがポイントである - これは深刻なゴミを示し

MySQLを持っています。いくつかの猫適切な「charset」パラメータ をその接続に渡しているうちに、適切なデコード(utf-8またはそれ以外の方法)でコード化された テキストが表示されます。しかし、あなたはすでにそれをしています -

あなたが行うことができる1つの試みは、オプションuse_unicode=False - を渡して、あなた自身のコードでutf-8ストリングをデコードします。

db = web.database(dbn='mysql', host="127.0.0.1", 
     user='test', pw='test', db='db_test', charset="utf8", use_unicode=False) 

これとあなたが試す可能性のある他のパラメータに接続するためのオプションをチェックしてください:

http://mysql-python.sourceforge.net/MySQLdb.html

かかわらず、それが正しくを動作するようになっての、上記のヒントを、私はのための回避策を得ましたあなた - エンコードされた文字列の は、ユニコード文字のように見えます( ( "cp1258"、 "cp1252"、 "palmos"、 " cp1254 ")

これらのうち、cp1252は "latin1"とほぼ同じです。これはMySQLが接続で "charset"引数を受け取らない場合、 を使用するデフォルトの文字セットです。しかし、 のweb2pyがデータベースに渡されていないだけでなく、 が間違ったエンコーディングになっているのではなく、web2pyがあなたの文字列を前後にエンコードし、エンコードエラーを無視しているかのようです、

comment = comment.encode("cp1252", errors="ignore") 

ので、この行を配置することは、今あなたのために働くかもしれない:これらのエンコーディングのすべてから

私は、たとえば、やって、UTF-8バイトの文字列として、あなたのオリジナルの「测试」という文字列を検索することができユニコードで推測することは決してうまくいきません - proeprのことは、web2pyを作ることで、最初に半二重のutf-8文字列を与えることです場所、それをそこに止める。

更新

私は、これは何が起こっているかであるhere-をチェックする - 、および0(use_unicode = Trueの場合)、あなたにそれを配信する前に、正しいUTF-8 '\xe6\xb5\x8b\xe8\xaf\x95'文字列は、MySQLから読み込み - これらのバイトは "cp1252"のようにデコードされています - これにより、不正なu'\xe6\xb5\u2039\xe8\xaf\u2022'ユニコードが生成されます。おそらくWeb2pyのエラーです。つまり、実際の接続に "charset = utf8"パラメータを渡すことはありません。生のバイトを与える代わりに "use_unicode = False"を設定すると、間違ったユニコード、つまり "utf-8"を使用するdencodeが選択されているように見えます(これは '\xc3\xa6\xc2\xb5\xe2\x80\xb9\xc3\xa8\xc2\xaf\xe2\x80\xa2') 。

上記の回避策は、元の正しい文字列を取得するための唯一の方法です。つまり、間違ったユニコードを指定すると、の設定が間違っています(多分、または可能な場合は、web2pyのか、MySQLのドライバを更新)データベース接続

**更新2 ** 私はfutrher web2pyのdal.pyファイル自体にコードをチェックする - それはセットアップにデフォルトでUTF-8などの接続を試みます - MySQLdbとpymysqlドライバの両方を試してみるようです - 両方ともインストールしているのであれば、pymysqlをアンインストールしてMySQLdbだけを残してください。

+0

詳細な分析をありがとうございました!あなたが与えた2つのステップの後で動作することができないので、それはまだ有益です。私は "偽use_unicode =" との接続を設定すると、私は次のようにのrepr(コメント)を得た:\ XC3 \ xa6 \ XC2 \ XB5 \ XE2 \ X80 \ xb9 \ XC3 \ xa8 \ XC2 \ XAF \ XE2 \ X80 \ XA2、それはですutf8はエンコードしません。それから私はcp1252(無視)でそれをエンコードしますが、それはまだ失敗しています。 BTW:私の元の質問では、前に言ったように、 "STRANGE"が意味するものは、まさにsemi utf8とsemi unicodeです。だから、私はそれが多分Webpyのバグだと思う。 – eason

+0

それはどこUTF-8で、1があなたがおしっこをprevioulsyなって何になるかのように、1つは、上記のシーケンスをデコードしようとすると: 'U '\ XE6 \ XB5 \ u2039 \ xe8 \ XAF \ u2022'' -now少なくとも私たちが知っていますweb2pyはどうやってそこに着いたの? – jsbueno

関連する問題