はsys.setdefaultencoding
何らかの理由で削除されており、復元にsite
は使用しないでください。reload(sys)
代わりに、私の解決策は何もしないことです。Python は ENV LANG 変数または Windowschcp
エンコーディングに基づいてエンコーディングを自動的に検出します。
$ python
Python 2.7.3 (default, Sep 26 2012, 21:51:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import os
>>> sys.stdout.encoding
'UTF-8'
>>> os.environ["LANG"]
'pl_PL.UTF-8'
>>> print u"\xabtest\xbb"
«test»
>>>
ただし、エンコーディングに必要な文字がない場合、問題が発生する可能性があります。代わりに、グレースフルに劣化を試みる必要があります - 必要な文字が表示される可能性は 0 に近いです (したがって、純粋な ASCII バージョンを使用するか、Unidecode を使用して使用可能な出力を表示する (または単に失敗する) 必要があります)。例外をキャッチして、代わりに文字列の基本バージョンを出力してみてください。
$ LANG=C python
Python 2.7.3 (default, Sep 26 2012, 21:51:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import os
>>> sys.stdout.encoding
'ANSI_X3.4-1968'
>>> os.environ["LANG"]
'C'
>>> print u"\xabtest\xbb"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xab' in position 0: ordinal not in range(128)
>>>
しかし、Unicode サポートに問題がある Windows と呼ばれる問題があります。技術的chcp 65001
には動作するはずですが、Python 3.3 を使用していない限り、実際には動作しません。Python はポータブルstdio.h
を使用しcmd.exe
ますが、WriteConsoleW()
. 実際には、確実に動作するのは 8 ビットのエンコーディング (CP437 など) だけです。
回避策は、Cygwin のコンソールや Python に含まれる IDLE など、Unicode を適切にサポートする他の端末を使用することです。