考虑下一个例子:
>>> s = u"баба"
>>> s
u'\xe1\xe0\xe1\xe0'
>>> print s
áàáà
我在空闲时使用cp1251
编码,但似乎解释器实际上使用latin1
来创建unicode字符串:
>>> print s.encode('latin1')
баба
为什么这样?是否存在此类行为的规范?
CPython,2.7。
修改
我实际需要的代码是
>>> u'\xe1\xe0\xe1\xe0' == u'\u00e1\u00e0\u00e1\u00e0'
True
似乎在使用latin1
编解码器对unicode进行编码时,所有的unicode点都会少于256,因此会产生我之前键入的字节。
答案 0 :(得分:8)
当您在终端中键入б
等字符时,会看到б
,但实际输入的是一个字节序列。
由于您的终端编码为cp1251
,因此输入баба
会导致字节序列等于баба
中编码的unicode cp1251
:
In [219]: "баба".decode('utf-8').encode('cp1251')
Out[219]: '\xe1\xe0\xe1\xe0'
(注意我上面使用utf-8
因为我的终端编码是utf-8
,而不是cp1251
。对我来说,"баба".decode('utf-8')
只是баба
的unicode。)
由于键入баба
会产生字节序列\xe1\xe0\xe1\xe0
,因此当您在终端中键入u"баба"
时,Python会收到u'\xe1\xe0\xe1\xe0'
。这就是你看到
>>> s
u'\xe1\xe0\xe1\xe0'
此unicode恰好代表áàáà
。
当你输入
>>> print s.encode('latin1')
latin1
编码将u'\xe1\xe0\xe1\xe0'
转换为'\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'