11

Python の学習を支援するプロジェクトとして、json データ (たとえば、www.reddit.com/all/.json) を使用して Reddit の CMD ビューアーを作成しています。特定の投稿が表示され、それらを印刷しようとすると (それがエラーの原因だと思います)、次のエラーが発生します。

トレースバック (最新の呼び出しが最後): ファイル "C:\Users\nsaba\Desktop\reddit_viewer.py"、33 行目、出力 ( "%d. (%d) %s\n" % (i+1, obj ['データ']['スコア'], obj['データ']['タイトル']))

ファイル "C:\Python33\lib\encodings\cp437.py"、19 行目、エンコードで返される codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' コーデックは文字 '\ をエンコードできませんu2019' の位置 32: 文字マップ

ここで私はデータを処理します:

request = urllib.request.urlopen(url)
content = request.read().decode('utf-8')
jstuff = json.loads(content)

上記のエラーにリストされているデータを印刷するために使用する行:

print ( "%d. (%d) %s\n" % (i+1, obj['data']['score'], obj['data']['title']))

誰かが私が間違っているかもしれない場所を提案できますか?

4

5 に答える 5

20

あなたの問題があなたが示したコードとは何の関係もなく、1行で再現できることはほぼ確実です:

print(u'\2019')

端末の文字セットが U+2019 を処理できない場合 (または、端末が使用する文字セットについて Python が混乱している場合)、それを出力する方法はありません。それが JSON から来ているか、それ以外から来ているかは問題ではありません。

Windows ターミナル (別名「DOS プロンプト」または「cmd ウィンドウ」) は通常、110000 文字のうち約 256 文字しか認識しない cp1252 のような文字セット用に構成されており、言語実装に大きな変更を加えずに Python がこれについてできることは何もありません。 .*

詳細、回避策、および詳細情報へのリンクについては、Python Wiki のPrintFailsを参照してください。SO には、この問題の複製が数百もあります (ただし、それらの多くは Python 2.x に固有のものですが、言及する必要はありません)。


* Windows には、UTF-16 を端末に出力するためのまったく別の API セットがあるため、Python は stdout が Windows 端末であることを検出できます。そうであれば、UTF-16 にエンコードし、端末の文字セットにエンコードする代わりに特別な API を使用します。標準のものを使用。しかし、これはさまざまな問題を引き起こします (たとえば、印刷方法が異なるstdoutと同期が取れなくなるなど)。これらの変更を行うことについて議論がありましたが、たとえ全員が同意し、パッチが明日書かれたとしても、それが追加される Python の将来のバージョンにアップグレードするまでは役に立ちません…</p>

于 2013-08-27T19:40:03.420 に答える
-1

IDLE (Python Shell) と Window の CMD デフォルト フォントを Lucida Console (utf-8 対応フォント) に設定すると、これらのタイプのエラーはなくなりました。ボックス [][][][][][][][] が表示されなくなりました

:)

于 2013-08-27T22:59:40.597 に答える