PythonのUnicode文字列とPythonの対話インタプリタ
-
19-09-2019 - |
質問
私はどのようにPythonのUnicode文字列と2.5取引理解しようとしています。今では私は私がコードでそれらを扱うことになってるかを十分に把握を持っていると思うが、私は完全にあなたがインタプリタのプロンプト文字列を入力する場合は特に、舞台裏で何が起こっているか理解していません。
両方str
由来するunicode
(バイト列)とbasestring
、予め3.0パイソンので、文字列のための2つのタイプ、すなわち、を有します。文字列のデフォルトのタイプはstr
です。
str
オブジェクトは、実際の符号化の概念を持っていない、彼らはただのバイトです。あなたは、Unicode文字列を自分でエンコードされたので、彼らがしている、またはあなたがそのあなたをコードするも(indeally)事前に知っていたバイトのストリームを読んだエンコーディングを知ってましたどちらか。あなたはエンコーディングあなたに不明なバイト文字列のエンコーディングを推測することができますが、ちょうどこれを考え出すの信頼できる方法はありません。あなたの最善の策は、早期にデコード後半あなたのコードとエンコードでどこでも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'
解決
私はイグナシオの返信を拡大してみましょう:両方のケースでPythonとあなたとの間に余分な層があります:1の場合には、の崇高なテキストのであり、他にそれがcmd.exe
です。ご覧の動作の違いは、Pythonによるものではないが、の崇高なテキストの(UTF-8、それはそうと)とcmd.exe
(CP437)で使用される様々なエンコーディングによってます。
ñ
を入力すると'\xc3\xb1'
がcmd.exe
を送るのに対し、ですから、の崇高なテキストのは、Pythonのに\xa4
を送信します。 [私は質問に関係のない細部を省略し、ここでsimplyfingだ。]。
それでも、Pythonはそれについて知っています。 cmd.exe
からは、おそらくのようなものを取得します。
>>> import sys
>>> sys.stdin.encoding
'cp437'
内のに対し、の崇高なテキストのあなたが
のようなものを買ってあげます>>> import sys
>>> sys.stdin.encoding
'utf-8'
他のヒント
インタプリタは、テキスト入力のためのあなたのコマンドプロンプトのネイティブエンコーディングを使用しています。あなたのケースでは、CP437です。
>>> print '\xa4'.decode('cp437')
ñ
あなたは混乱して取得しています。お使いのエディタがcp437
を使用しながら、Pythonインタプリタは、お使いのシステムのデフォルト(この場合は、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'
この話の教訓?エンコーディングはトリッキーです。あなたのソースファイルがである、または常に特殊文字のエスケープバージョンを使用して、それが安全に遊ぶエンコードするか知っていることを確認してください。