1

私はpymysqlモジュールを初めて使用し、それを発見しようとしています.単純なコードがあります:

import pymysql

conn=pymysql.connect(host="127.0.0.1",
                         port=8080,user="root",
                         passwd="mysql",
                         db="world",
                         charset="utf8",
                         use_unicode=True)
cur=conn.cursor()
cur.execute("SELECT * FROM world.city")

for line in cur:
    print(line)

cur.close()
conn.close()

Visual Studio 用の Python ツールを使用しています。コードを実行すると、次のエラーで失敗します。

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\1.5\visualstudio_py_debugger.py", li
ne 1788, in write
    self.old_out.write(value)
  File "C:\Python32\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 6-7: cha
racter maps to <undefined>

失敗した行には都市名が含まれています:´s-Hertogenbosch

おそらくcmd出力に関連する問題だと思ったので、Pythonシェルに切り替えましたが、スクリプトはエラーなしで実行されました。

それで、私が直面している問題は何ですか?どうすれば解決できますか?

Python Tools for Visual Studio を本当に使用したいので、PTVS を使用できるようにする回答を大歓迎します。

4

2 に答える 2

3

私の推測では、PythonスクリプトがUnicodeでエンコードしようとしているにもかかわらず、受信しているデータはUnicodeではありません。

データベースとテーブルに固有の文字セットと照合の設定を確認します。utf8とutf8_general_ciはあなたの友達です。

于 2012-10-10T10:52:46.403 に答える
1

問題はおそらく、環境の出力エンコーディングがcp437に設定されており、ユニコード文字をそのエンコーディングに変換できないことです。これを行うprint(line)と、おそらくに変換されself.old_out.write(value)ます。

print()次のようにファイルに書き込んで、ループの内側を置き換えてみてください。

with open('myoutput.txt', 'w', encoding='utf-8') as f:
    for line in cur:
        f.write(line)

ええと、しかしカーソルは文字列行を返しません。要素の行(タプルだと思います)を返します。そのため、おそらく次のようなことをする必要があります。

with open('myoutput.txt', 'w', encoding='utf-8') as f:
    for row in cur:
        f.write(repr(row))

これは、診断目的には十分な場合があります。より良い文字列が必要な場合は、特定の方法でフォーマットする必要があります。

また、あなたは書いた:

                     charset="utf8",
                     use_unicode=True)

charsetを使用する場合は、省略use_unicode=Trueできます(これは、を使用することで暗示されcharsetます。正しく思い出せば、charset='utf8'Pythonで認識されるエンコーディングではありません。charset='utf-8'つまり、との間にダッシュまたはアンダースコアを付けて使用する必要がutfあり8ます。修正:utf8おそらくエイリアスの1つとして機能します。

コメントに基づく更新...

ファイルへの出力は問題ないように思われるため、問題はprintコマンドの出力に使用されるウィンドウの機能に関連しています。知っているのcmdはcp437だけなので、または別のウィンドウ(GUIのUnicode対応ウィンドウなど)を使用するか、cmd別のエンコーディングを使用するようにに指示する必要があります。他の人の経験を参照してください。基本的に、コンソールに次のように伝える必要があります。

chcp 65001

受け入れられた出力エンコーディングをUTF-8に変更するか、必要な文字をサポートする別の(非Unicode)エンコーディングを使用できます。また、コンソールフォントは、文字を表示できる必要があります(つまり、文字の画像であるグリフを含めることができます)。

于 2012-10-10T10:53:31.217 に答える