根据我的理解,当连接字符串和Unicode字符串时,Python将根据默认编码自动解码字符串,并在连接之前转换为Unicode。
如果默认为'ascii'
,我会假设这样的事情(如果有误,请更正):
string - > ASCII十六进制字节 - > Unicode十六进制字节 - > Unicode字符串
如果例如UnicodeDetectionError
在连接之前直接转换为u'a' + 'Ӹ'
,会不会更容易并且提高u'a' + u'Ӹ'
?为什么需要首先解码字符串?如果字符串包含非ASCII字符,如果它仍将转换为Unicode,为什么重要?
答案 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+00A4
,U+0141
还是U+20AC
?
所以,字符串编码很重要!