б
などの文字を端末に入力すると、б
が表示されますが、実際に入力されるのは一連のバイトです。
端末符号化はcp1251
でエンコードされたUnicode баба
に等しいバイトのシーケンスのбаба
結果を入力し、cp1251
あるので:
In [219]: "баба".decode('utf-8').encode('cp1251')
Out[219]: '\xe1\xe0\xe1\xe0'
(cp1251
、私の端末の符号化がutf-8
であるので、私は上記utf-8
を使用しないで注意してください。私のために、"баба".decode('utf-8')
は単なるбаба
のユニコードです。)
タイプбаба
はバイトシーケンスs \xe1\xe0\xe1\xe0
、端末にu"баба"
と入力すると、Pythonは代わりにu'\xe1\xe0\xe1\xe0'
を受信します。あなたは
>>> s
u'\xe1\xe0\xe1\xe0'
このUnicodeがáàáà
を表現するためにたまたま見ている理由です。
そして、あなたは
>>> print s.encode('latin1')
を入力するとlatin1
エンコーディングは'\xe1\xe0\xe1\xe0'
からu'\xe1\xe0\xe1\xe0'
変換されます。 端末はバイト'\xe1\xe0\xe1\xe0'
のシーケンスを受信し、cp1251
でそれらをデコードし、従ってбаба
印刷:
In [222]: print('\xe1\xe0\xe1\xe0'.decode('cp1251'))
баба
試行:
>>> s = "баба"
(u
せず)の代わり。または、
>>> s = "баба".decode('cp1251')
s
unicode
を作ります。あなたは間違った質問をしている
>>> s = u'\N{CYRILLIC SMALL LETTER BE}\N{CYRILLIC SMALL LETTER A}\N{CYRILLIC SMALL LETTER BE}\N{CYRILLIC SMALL LETTER A}'
または短いが少なく、容易に理解できる
>>> s = u'\u0431\u0430\u0431\u0430'
:または、冗長が、非常に明確な(とターミナルをコードするとらわれない)を使用します。問題は「どのようなエンコーディングがUnicode文字列リテラルに使われているか」(無意味な質問;エンコーディングは入力/出力のものであり、内部表現は明らかにUnicodeを表すものであり、それだけのことです)。あなたが本当に答えを知りたい質問は、「なぜIDLEは私のテキストエンコーディングを乱しているのですか?それは入力や出力で起こっていますか?そして、私が望むことをやり遂げるにはどうすればいいのですか? – kindall
エンコーディングをどのように定義していますか?ソースファイルにエンコーディングを定義する方法については、http://www.python.org/dev/peps/pep-0263/を参照してください。あなたのpythonバージョンも教えてください。 http://docs.python.org/howto/unicode.html によれば、使用されるデフォルトのエンコーディングはASCIIです。 2.4より前のPythonのバージョンはユーロ中心であり、文字列リテラルのデフォルトのエンコーディングとしてLatin-1を仮定しました –
@kindallよくafaik、ユニコードオブジェクトを作成する際にエンコーディングが必要です(バイトは必要ですが意味のある文字です) 。ではなぜインタープリターはバイト - >文字トランスを実行するために私の実際のエンコーディングを使用しないのですか? –