Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于“u”的编码&引用;字面量_Python_Unicode_Encoding - Fatal编程技术网

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
中编码的unicode
cp1251

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'