考虑下一个例子:
>>> s = u"баба"
>>> s
u'\xe1\xe0\xe1\xe0'
>>> print s
áàáà
我在idle中使用cp1251
编码,但似乎解释器实际上使用latin1
来创建unicode字符串:
为什么?这样的行为有规范吗?在
CPython,2.7。在
编辑
我要找的代码是
>>> u'\xe1\xe0\xe1\xe0' == u'\u00e1\u00e0\u00e1\u00e0'
True
似乎在用latin1
编解码器编码unicode时,所有小于256的unicode点都会像我之前输入的字节那样简单地保留下来。在
当您在终端中输入一个字符,如
б
,您会看到一个б
,但真正输入的是一个字节序列。在由于您的终端编码是
cp1251
,因此键入баба
会导致字节序列等于在cp1251
中编码的unicodeбаба
:(注意,我使用上面的}。对我来说,
utf-8
,因为我的终端编码是utf-8
,而不是{"баба".decode('utf-8')
只是баба
的unicode因为输入}。这就是你看到的原因
^{pr2}$баба
会产生字节序列\xe1\xe0\xe1\xe0
,所以当您在终端中输入u"баба"
时,Python会收到{这个unicode正好代表
áàáà
。在当你打字的时候
latin1
编码将u'\xe1\xe0\xe1\xe0'
转换为'\xe1\xe0\xe1\xe0'
。 终端接收字节序列'\xe1\xe0\xe1\xe0'
,并用cp1251
解码,从而打印баба
:尝试:
(没有
u
)而是。或者使
s
unicode
。或者,使用冗长但非常明确的(和终端编码不可知的):或者是简短但不容易理解
相关问题 更多 >
编程相关推荐