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

标签 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 时,所有小于 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/

相关文章:

python - 将行号传递给嵌入式 Python 解释器

python - Python 列表可以有多大?

python - 如何在 Python 3 CGI 中打印 unicode 字符?

python 调用外部cmd并将stdout重定向到文件

Python ctypes - 如何处理字符串数组

Haskell 不支持 unicode 符号构造函数(例如 : ◁)?

读取带有BOM的UTF-8文本文件

c - GCC 和 CLang 无法识别 Unicode 字符串

java从postgres转换为utf-8

python - 使用 Python 3 编码和解码二进制数据以包含到 JSON 中