Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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 “是什么编码?”;执行官;功能假设?_Python_Unicode - Fatal编程技术网

Python “是什么编码?”;执行官;功能假设?

Python “是什么编码?”;执行官;功能假设?,python,unicode,Python,Unicode,当您调用Python(2.7+)“exec”函数时,对所提供的字符串输入进行解码时,需要做哪些假设或操作 (通过比较-如果您希望项目中的源.py文件包含unicode,则必须在文件顶部嵌入“魔术序列”。) 我注意到exec似乎可以在字符串输入中查找unicode,尽管我没有尝试在任何地方指示编码 例如,我可以通过exec传递此字符串: my_string = "That will cost you ¥ 800.00" exec生成的结果my_字符串变量中确实包含日元符号。看来exec是在假设u

当您调用Python(2.7+)“exec”函数时,对所提供的字符串输入进行解码时,需要做哪些假设或操作

(通过比较-如果您希望项目中的源.py文件包含unicode,则必须在文件顶部嵌入“魔术序列”。)

我注意到exec似乎可以在字符串输入中查找unicode,尽管我没有尝试在任何地方指示编码

例如,我可以通过exec传递此字符串:

my_string = "That will cost you ¥ 800.00"
exec生成的结果my_字符串变量中确实包含日元符号。看来exec是在假设utf-8

迈克尔

来自:

第一个表达式的计算结果应为Unicode字符串、Latin-1编码字符串、开放文件对象、代码对象或元组


看起来好像
str
是基于本机系统编码的,尽管小于127的字符可以作为utf-8字符传递;有时会产生有趣的编码结果。

exec
自动假定str使用utf-8 unicode。一旦超出的字符串文本(unicodes除外)被编码为UTF-8。

AFAIK Python不承担任何义务,也不承担任何义务。如果你看这本书,你会读到:

第一个表达式的计算结果应为字符串、打开的文件对象或代码对象

我的2.7.3手册上也有。Python2.7.10的doc并没有明确说明自2.4以来有什么变化

我在2.7.3上做了一些测试,以编码形式写入非ascii字符以避免第一次插值

如果使用简单字符串,它将按原样解释。在Latin1系统上:

>>> exec "x = 'That will cost you \xa5 800.00'"
>>> x
'That will cost you \xa5 800.00'
>>> print x
That will cost you ¥ 800.00
在CP850系统上:

>>> exec "x = 'That will cost you \xbe 800.00'"
>>> x
'That will cost you \xbe 800.00'
>>> print x
That will cost you ¥ 800.00
。。。并且
print x
在两个系统上都是错误的,因为它们都不是utf8:-(

如果输入字符串是unicode,情况就不同了。在这种情况下,您将得到一个隐式UTF8转换:在两个系统中

>>> print u"That will cost you \u00a5 800.00"
That will cost you ¥ 800.00
>>> exec u"x = 'That will cost you \u00a5 800.00'"
>>> x
'That will cost you \xc2\xa5 800.00'
当然,如果一切都是unicode,那么在两个系统上都会正常运行:

>>> exec u"x = u'That will cost you \u00a5 800.00'"
>>> x
u'That will cost you \xa5 800.00'
>>> print x
That will cost you ¥ 800.00

如果这里的任何人有一个2.7.10来确认或削弱它,那真的很好。

exec
解析字节字符串的方式与Python读取脚本文件的方式相同

对于Python 2.1–2.7(根据),这意味着您默认获得ISO-8859-1,但您可以使用编码注释对其进行更改:

>>> exec 'print [hex(ord(c)) for c in u"\xC2\xA5"]'
['0xc2', '0xa5']

>>> exec '# coding=iso-8859-1\nprint [hex(ord(c)) for c in u"\xC2\xA5"]'
['0xc2', '0xa5']

>>> exec '# coding=utf-8\nprint [hex(ord(c)) for c in u"\xC2\xA5"]'
['0xa5']

调用
exec
的脚本文件的编码不会影响字符串内部代码的编码。(当然,如果您直接写入非ASCII字符,外部脚本编码确实会确定字符串中的字节。)

您引用的参考文件说它可以是“unicode字符串”…但它没有提到具体的编码。我想这意味着它并不是真的“解码”字符串本身..它可能只是保留在输入字符串中找到的任何字节..这些字节可能表示的任何编码。这就是我的逻辑:)在这种情况下,我不认为Python使用Unicode,因为¥是拉丁语-1的一部分,代码值为165。我花了一些时间进行测试,但我必须告诉您,至少对于Python 2.7.3来说,这个答案是错误的。我确认UTF8或拉丁文1表示¥是
\xa5
\u00a5
代码165或0xa5。尽管我没有编辑我的问题,但根据评论同意。在我的情况下,我从包含UTF8字符的文本文件中填充python 2.7 str类型,并因此以字符串结束,如:“a=”◀ unicode_检验▶'". 当我执行这些时,组成这些箭头符号的unicode字节由exec“保存”。在读取文件字符串时,或在执行它们之前,我不会在任何地方加前缀“u”。我想我真正想知道的是,它是否在我的情况下工作,仅仅是因为我运气好(即沿途的默认编码正在帮助我)或者如果我的方法是正确的。。