>> s = u"баба" >>> s u'\xe1\xe0\xe1\xe0' >>> print s áàáà 我在空闲时使用 cp1251 编码,但看起来解释器实际上使用 l-6ren">
gpt4 book ai didi

python - 用于 u""文字的编码

转载 作者:太空狗 更新时间:2023-10-29 22:27:38 26 4
gpt4 key购买 nike

考虑下一个例子:

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com