2012-01-15 10 views
6

は、次の例で考えてみましょう「」Uに使用:私はアイドルの中cp1251エンコーディングを使用していますが、インタプリタが実際にUnicode文字列を作成するためにlatin1を使用するようにそれはそうエンコーディングがリテラル

>>> s = u"баба" 
>>> s 
u'\xe1\xe0\xe1\xe0' 
>>> print s 
áàáà 

を:

>>> print s.encode('latin1') 
баба 

なぜですか?このような動作の仕様はありますか?

CPython、2.7。


編集

Iが実際に探していたコードが

>>> u'\xe1\xe0\xe1\xe0' == u'\u00e1\u00e0\u00e1\u00e0' 
True 

ことであるように256を単に放置されていることを以下latin1コーデック、すべてのUnicodeポイントとUnicodeを符号化するときのように思えるです前に入力したバイトが返されます。

+3

:または、冗長が、非常に明確な(とターミナルをコードするとらわれない)を使用します。問題は「どのようなエンコーディングがUnicode文字列リテラルに使われているか」(無意味な質問;エンコーディングは入力/出力のものであり、内部表現は明らかにUnicodeを表すものであり、それだけのことです)。あなたが本当に答えを知りたい質問は、「なぜIDLEは私のテキストエンコーディングを乱しているのですか?それは入力や出力で起こっていますか?そして、私が望むことをやり遂げるにはどうすればいいのですか? – kindall

+3

エンコーディングをどのように定義していますか?ソースファイルにエンコーディングを定義する方法については、http://www.python.org/dev/peps/pep-0263/を参照してください。あなたのpythonバージョンも教えてください。 http://docs.python.org/howto/unicode.html によれば、使用されるデフォルトのエンコーディングはASCIIです。 2.4より前のPythonのバージョンはユーロ中心であり、文字列リテラルのデフォルトのエンコーディングとしてLatin-1を仮定しました –

+0

@kindallよくafaik、ユニコードオブジェクトを作成する際にエンコーディングが必要です(バイトは必要ですが意味のある文字です) 。ではなぜインタープリターはバイト - >文字トランスを実行するために私の実際のエンコーディングを使用しないのですか? –

答えて

8

бなどの文字を端末に入力すると、бが表示されますが、実際に入力されるのは一連のバイトです。

端末符号化は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') 

sunicodeを作ります。あなたは間違った質問をしている

>>> 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' 
+0

ありがとう、あなたは正しい方法で私を引っ張った。 –