用于u“”字面值的编码

2024-09-28 01:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑下一个例子:

>>> s = u"баба"
>>> s
u'\xe1\xe0\xe1\xe0'
>>> print s
áàáà

我在idle中使用cp1251编码,但似乎解释器实际上使用latin1来创建unicode字符串:

^{pr2}$

为什么?这样的行为有规范吗?在

CPython,2.7。在


编辑

我要找的代码是

>>> u'\xe1\xe0\xe1\xe0' == u'\u00e1\u00e0\u00e1\u00e0'
True

似乎在用latin1编解码器编码unicode时,所有小于256的unicode点都会像我之前输入的字节那样简单地保留下来。在


Tags: 字符串规范编码unicode解释器例子printidle
1条回答
网友
1楼 · 发布于 2024-09-28 01:24:31

当您在终端中输入一个字符,如б,您会看到一个б,但真正输入的是一个字节序列。在

由于您的终端编码是cp1251,因此键入баба会导致字节序列等于在cp1251中编码的unicodeбаба

In [219]: "баба".decode('utf-8').encode('cp1251')
Out[219]: '\xe1\xe0\xe1\xe0'

(注意,我使用上面的utf-8,因为我的终端编码是utf-8,而不是{}。对我来说,"баба".decode('utf-8')只是баба的unicode

因为输入баба会产生字节序列\xe1\xe0\xe1\xe0,所以当您在终端中输入u"баба"时,Python会收到{}。这就是你看到的原因

^{pr2}$

这个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')

使sunicode。或者,使用冗长但非常明确的(和终端编码不可知的):

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

相关问题 更多 >

    热门问题