用于u“”文字的编码

时间:2012-01-15 19:50:58

标签: python unicode encoding

考虑下一个例子:

>>> 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,因此会产生我之前键入的字节。

1 个答案:

答案 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'