5

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'
4

3 に答える 3

7

Ignacio の回答を拡張させてください: どちらの場合も、Python とあなたの間に余分なレイヤーがあります: 1 つの場合はSublime Textで、もう1 つの場合はcmd.exe. 表示される動作の違いは、Python によるものではなく、Sublime Text (見た目は utf-8) とcmd.exe(cp437) で使用されるエンコーディングの違いによるものです。

そのため、 と入力するñと、Sublime Text'\xc3\xb1'は Python に送信しますが、 はcmd.exe送信します\xa4。[ここでは、質問に関係のない詳細を省略して簡単に説明しています。].

それでも、Python はそのことを知っています。あなたcmd.exeはおそらく次のようなものを得るでしょう:

>>> import sys
>>> sys.stdin.encoding
'cp437'

一方、Sublime Text内では、次のようなものが得られます

>>> import sys
>>> sys.stdin.encoding
'utf-8'
于 2010-03-10T23:01:32.313 に答える
3

インタープリターは、コマンド プロンプトのネイティブ エンコーディングをテキスト入力に使用します。あなたの場合、それは CP437 です:

>>> print '\xa4'.decode('cp437')
ñ
于 2010-03-10T22:35:03.897 に答える
1

エディターとインタープリターが異なるエンコーディングを使用しているため、混乱しています。Pythonインタープリターはシステムのデフォルト(この場合はcp437)を使用しますが、エディターはを使用しますutf-8

次のようにUnicode文字列を指定すると、違いがなくなることに注意してください。

# Windows python interpreter
>>> s = "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s = u"La caña de España"
>>> s
u'La ca\xf1a de Espa\xf1a'

物語の教訓は?エンコーディングには注意が必要です。ソースファイルがどのエンコーディングであるかを知っていることを確認するか、常にエスケープされたバージョンの特殊文字を使用して安全に再生してください。

于 2010-03-10T22:49:14.333 に答える