2016-07-13 4 views
0

文字列とUnicode文字列を連結すると、Pythonはデフォルトのエンコーディングに基づいて文字列を自動的にデコードし、連結する前にUnicodeに変換します。 > ASCIIの16進バイト - - > Unicodeの16進バイト - それはではないでしょう> Unicode文字列ユニコードとバイト文字列の連結

文字列:デフォルトは(間違っている場合修正してください)'ascii'であれば

私はこのようなものを想定しています連結する直前にu'a' + 'Ӹ'u'a' + u'Ӹ'に変換された場合は、UnicodeDetectionErrorを簡単に小さくします。文字列を最初にデコードする必要があるのはなぜですか?とにかくUnicodeに変換される場合、文字列に非ASCII文字が含まれているとどうして重要ですか?例えば、u'a' + 'Ӹ'を直接連結する前にu'a' + u'Ӹ'に変換され、場合

+1

「16進バイト」とは何ですか? –

+0

あなたはPythonのどのバージョンについて話していますか? –

+0

@KerrekSBそれは意味をなさないと申し訳ありません - 私は16進数で表されたバイト(1つのASCII文字で)を意味しました。 – cafekaze

答えて

3

は、それが容易になり、より少ないUnicodeDetectionErrorを上げませんか?

実行時にリテラルではなく、文字列で行う可能性があります。 'Ӹ'文字を含む文字列を想像してください。どのようにユニコードでu'Ӹ'に変換できると思いますか?それはデコードされなければなりません!

Ӹは、UnicodeコードポイントU+04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESISです。 'Ӹ'u'Ӹ'は同じ方法でエンコードされていません(実際は、U + 04F8をサポートする8ビットエンコーディングも見つからないため)、単純に一方を他方に直接変更することはできません。文字列は、ソースエンコーディング(ASCII、ISO-8859-1など)からターゲットエンコーディング(UTF-8、UTF-16、UTF-32)で表現できる仲介者(ISO 10646、Unicode)にデコードする必要があります。 、など)。

なぜ文字列を最初にデコードする必要がありますか?

連結される2つの値は、連結する前に同じエンコーディングにする必要があるためです。

とにかくUnicodeに変換される場合、文字列に非ASCII文字が含まれているとどうなるのはなぜですか?

ASCII以外の文字は異なるエンコーディングで表現されるため、ユニコードはユニバーサルですが、他のエンコーディングはユニバーサルです。 Pythonは何百ものエンコーディングをサポートしています。

たとえば、ユーロ記号(、Unicode codepoint U+20AC)を取ってください。これはASCIIおよびほとんどのISO-8859-Xエンコーディングでは存在しませんが、ISO-8859-7、-15、および-16ではバイト0xA4として、Windows-1251では0x88としてエンコードされます。しかし、0xA4は、他のエンコーディングでは異なるUnicodeコードポイントを表します。それは、ISO-8859-1で(U+00A4 CURRENCY SIGN¤ですが、ISO-8859-2でŁU+0141 CAPITAL LETTER L WITH STROKE)であるなど

ですから、PythonがUnicodeに0xA4のを変換するために期待しますか? U+00A4U+0141、または U+20ACに変換する必要がありますか?

だから、文字列エンコーディングは重要です!

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)