Python 2.5 がユニコード文字列をどのように扱うかを理解しようとしています。コードでそれらをどのように処理するべきかについては、今ではよく理解できていると思いますが、特にインタープリターのプロンプトで文字列を入力するときに、舞台裏で何が起こっているのかを完全には理解していません。
そのため、python pre 3.0 には文字列の 2 つのタイプ、つまりstr
(バイト文字列) とunicode
があり、どちらも から派生していbasestring
ます。文字列のデフォルトの型はstr
.
str
オブジェクトには実際のエンコーディングの概念がなく、単なるバイトです。自分で Unicode 文字列をエンコードしたため、それらがどのエンコーディングであるかを知っているか、エンコーディングも事前に (実際には) 知っているバイトのストリームを読み取ったかのいずれかです。エンコーディングが不明なバイト文字列のエンコーディングを推測することはできますが、これを理解する信頼できる方法はありません。最善の策は、早い段階でデコードし、コードのあらゆる場所で Unicode を使用し、後でエンコードすることです。
それはいいです。しかし、インタープリターに入力された文字列は、実際に背後でエンコードされているのでしょうか? Python での文字列に関する私の理解が正しければ、Python がこの決定を行うために使用するメソッド/設定は何ですか?
私の混乱の原因は、システムの python インストールと、エディターの組み込み python コンソールで同じことを試したときに得られる結果が異なることです。
# Editor (Sublime Text)
>>> s = "La caña de España"
>>> s
'La ca\xc3\xb1a de Espa\xc3\xb1a'
>>> s.decode("utf-8")
u'La ca\xf1a de Espa\xf1a'
>>> sys.getdefaultencoding()
'ascii'
# Windows python interpreter
>>> s= "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s.decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte
>>> sys.getdefaultencoding()
'ascii'