unicode和字节串的串联

时间:2016-07-13 00:19:04

标签: python unicode ascii

根据我的理解,当连接字符串和Unicode字符串时,Python将根据默认编码自动解码字符串,并在连接之前转换为Unicode。

如果默认为'ascii',我会假设这样的事情(如果有误,请更正):

string - > ASCII十六进制字节 - > Unicode十六进制字节 - > Unicode字符串

如果例如UnicodeDetectionError在连接之前直接转换为u'a' + 'Ӹ',会不会更容易并且提高u'a' + u'Ӹ'?为什么需要首先解码字符串?如果字符串包含非ASCII字符,如果它仍将转换为Unicode,为什么重要?

1 个答案:

答案 0 :(得分:3)

  

例如,如果u'a' + 'Ӹ'在连接之前直接转换为u'a' + u'Ӹ',那么会不会更容易并且增加更少的UnicodeDetectionError?

它可能用文字来做,但在运行时不能用字符串字符。想象一下包含'Ӹ'字符的字符串。您如何认为它可以在Unicode中转换为u'Ӹ'?它有待解码!

Ӹ是Unicode代码点U+04F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS'Ӹ'u'Ӹ'的编码方式不同(事实上,我甚至找不到支持U + 04F8的8位编码),因此您不能直接将其中一个更改为另一个。字符串必须从其源编码(ASCII,ISO-8859-1等)解码为可以用目标编码表示的中介(ISO 10646,Unicode)(UTF-8,UTF-16,UTF-32)等等。)

  

为什么需要首先解码字符串?

因为连接的两个值在连接之前需要使用相同的编码。

  

如果字符串包含非ASCII字符,如果它仍将转换为Unicode,为什么重要?

因为非ASCII字符在不同的编码中表示不同。 Unicode是通用的,但其他编码则不是。 Python支持数百种编码。

以欧元符号(,Unicode代码点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将0xA4转换为Unicode?它应该转换为U+00A4U+0141还是U+20AC

所以,字符串编码很重要!

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