Python 用于“u”的编码&引用;字面量
考虑下一个例子:Python 用于“u”的编码&引用;字面量,python,unicode,encoding,Python,Unicode,Encoding,考虑下一个例子: >>> s = u"баба" >>> s u'\xe1\xe0\xe1\xe0' >>> print s áàáà 我正在idle中使用cp1251编码,但解释器似乎实际使用latin1来创建unicode字符串: >>> print s.encode('latin1') баба 为什么会这样?这种行为有规范吗 CPython,2.7 编辑 我要找的代码是 >>> u'\xe1\
>>> s = u"баба"
>>> s
u'\xe1\xe0\xe1\xe0'
>>> print s
áàáà
我正在idle中使用cp1251
编码,但解释器似乎实际使用latin1
来创建unicode字符串:
>>> print s.encode('latin1')
баба
为什么会这样?这种行为有规范吗
CPython,2.7
编辑 我要找的代码是
>>> u'\xe1\xe0\xe1\xe0' == u'\u00e1\u00e0\u00e1\u00e0'
True
似乎当使用拉丁编码解码器对unicode编码时,所有小于256的unicode点都被简单地保留下来,从而产生我以前输入的字节。当你在终端中输入字符,如
б
时,你会看到一个б
,但真正输入的是一个字节序列
由于您的终端编码是cp1251
,因此键入cp1251
将导致字节序列等于cp1251
中编码的unicodecp1251
:
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恰好表示áááa
当你打字的时候
>>> 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'))
баба
尝试:
(不带u
)。或者
>>> s = "баба".decode('cp1251')
使s
unicode
。或者,使用冗长但非常明确的(和终端编码不可知的):
或者简短但不易理解的
>>> s = u'\u0431\u0430\u0431\u0430'
你问错问题了。问题不是“Unicode字符串文字使用什么编码”(一个毫无意义的问题;编码是输入/输出的东西,内部表示显然是可以表示Unicode的东西,这就是您需要知道的全部)。你真正想知道答案的问题是“为什么空闲会弄乱我的文本编码,它是发生在输入还是输出上,我如何让它做我想做的?”你是如何定义编码的?有关在源文件中定义编码的信息,请参阅。请给出你的python版本。根据默认情况,使用的编码将是ASCII。Python 2.4之前的版本以欧洲为中心,并假定拉丁语-1是字符串的默认编码literals@kindall好吧,好吧,我们确实需要在创建unicode对象时进行编码(因为我们不需要字节,而需要有意义的字符)。那么,为什么解释器不使用我的实际编码来执行字节->字符转换?@Gagandeep cp1251只是我的默认操作系统编码。解释器无法知道编码,除非您提供它。
>>> 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'