2016-06-22 32 views
0

Python 2.7モジュールadodbapiを使用してSQL Server上のテーブルにアクセスしようとしていて、特定の情報をコマンドプロンプト(Windows)に出力しようとしています。だから私は、オンラインでこれを見上げ"UnicodeEncodeError: 'ascii'コーデックで文字 '¥u2019'"をエンコードできないのですか?

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 52: oridinal not in range(128) 

と:それは約30行、正しくフォーマットすべてをプリントアウトしますが、それは停止し、私にこれを与える

query_str = "SELECT id, headline, state, severity FROM GPS3.Defect ORDER BY id" 

cur.execute(query_str) 
dr_data = cur.fetchall() 
con.close() 

for i in dr_data: 
    print i 

:ここに私の元のコードスニペットですPythonでUnicodeを説明するプレゼンテーションを行ったので、私は理解したと思った。ですから、私はPython インタプリタにUnicodeを扱っていると明示し、UTF-8にエンコードする必要があります。 は、これは私が思い付いたものです:

for i in dr_data: 
    print (u"%s"%i).encode('utf-8') 

しかし、私はこれを実行すると、私はまったく同じエラーが出るので、私は実際にUnicodeを理解していないと仮定します。私はこの質問がたくさん聞かれることを知っていますが、誰かが私に説明することができます、単純に、ここで何が起こっているのですか?前もって感謝します。

+0

'type(i)とは何ですか?その可能性のある 'str'は' unicode'ではありませんが、説明上重要です。 – tdelaney

+1

また、2回目の試行で同じエラーが発生しましたか、エンコードエラーではなくデコードエラーが発生しましたか? – tdelaney

+0

'type(i)'は ' '、と私は同じ正確なエラーを両方の時間を得る –

答えて

0

エラーメッセージは、Windowsのコマンドプロンプトで印刷する文と一致しません。これは、asciiコーデックに既定ではありません。米国のWindowsでは、デフォルトでcp437になります。

エンコードせずに、コンソールにUnicodeを印刷するだけで済みます。 Pythonは、Unicode文字列をコンソールエンコーディングにエンコードします。ここに例があります。 ソースファイルはUTF-8エンコーディングで保存され、エンコーディングは特別な#coding:utf8コメントで宣言されています。これにより、任意のUnicode文字をソースコードに入れることができます。

#coding:utf8 
s1 = u'αßΓπΣσµτ' # cp437-supported 
s2 = u'ÀÁÂÃÄÅ'  # cp1252-supported 
s3 = u'我是美国人。' # unsupported by cp437 or cp1252. 

cp437に私の米国Windowsコンソールのデフォルト以来、唯一の s1は、エラーなしで表示されます。

C:\>chcp 
Active code page: 437 

C:\>py -2 -i test.py 
>>> print s1 
αßΓπΣσµτ 
>>> print s2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\cp437.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-3: character maps to <undefined> 
>>> print s3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\cp437.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: character maps to <undefined> 

エラーメッセージは、使用しようとしたエンコードを示します。cp437

私はコンソールのエンコーディングを変更した場合は、今s2が正常に動作します:

C:\>chcp 1252 
Active code page: 1252 

C:\>py -2 -i test.py 
>>> print s1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeEncodeError: 'charmap' codec can't encode character u'\u03b1' in position 0: character maps to <undefined> 
>>> print s2 
ÀÁÂÃÄÅ 
>>> print s3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\encodings\cp1252.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: character maps to <undefined> 

を今s3は、一般的な西洋のエンコーディングがサポートされていない文字が含まれています。コントロールパネルに入り、システムロケールを中国語に変更すると、コンソールで中国語のエンコードがサポートされますが、より良い解決策は、すべてのUnicode文字をサポートするエンコードであるUTF-8をサポートするPython IDEを使用することです、またはコース)。要約すると

>>> print s1 
αßΓπΣσµτ 
>>> print s2 
ÀÁÂÃÄÅ 
>>> print s3 
我是美国人。 

、単にUnicode文字列を使用して、理想的にUTF-8を備えた端末を使用して、それが「ただ働き」になります。以下はPythonWinの出力、pywin32 Python拡張が付属していますエディタです。ファイル、ユーザー入力、ネットワークソケットなどから読み込んだテキストデータをUnicodeに変換します。ユニコードで処理して印刷しますが、プログラムを終了するときにエンコードします(ファイル、ネットワークソケットなどに書き込む)。

関連する問題