考虑下一个例子:
>>> 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 时,所有小于 256 的 unicode 点都被简单地保留下来,从而导致我之前输入的字节。
最佳答案
当你在终端输入б
这样的字符时,你看到的是б
,但真正输入的是一个字节序列。
由于您的终端编码是 cp1251
,因此键入 баба
会导致字节序列等于在 cp1251 中编码的 unicode
:баба
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'
关于python - 用于 u""文字的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8872796/