“exec”函数假设的编码是什么?

时间:2015-06-03 13:37:44

标签: python unicode

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

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

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

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

my_string = "That will cost you ¥ 800.00"

并且exec生成的结果my_string变量确实会包含Yen符号。所以出现 exec假设是utf-8?

迈克尔

4 个答案:

答案 0 :(得分:4)

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

对于Python 2.1-2.7(根据PEP 263),这意味着您默认获得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字符,外部脚本编码会确定字符串中的字节数。)

答案 1 :(得分:0)

AFAIK Python不承担任何责任,也没有。如果您查看Python Language Reference v2.6,请阅读:

  

第一个表达式应该计算为字符串,打开文件对象或代码对象

我的2.7.3手册也是如此。 Python 2.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确认或证实它真的很好。

答案 2 :(得分:-1)

来自The Python Language Reference

  

第一个表达式应该计算为Unicode字符串,Latin-1编码字符串,打开文件对象,代码对象或元组。

似乎[HttpPost] [ActionName("GetItems")] public SampleResponse GetItems(SearchDTO searchDTO) { //Calling a different layer for the read operation based in the parameter values return BusinessLayer.GetItems(searchDTO); } 是基于本机系统编码的,尽管小于127的字符可以作为utf-8字符传递;有时候有趣的编码结果。

答案 3 :(得分:-1)

exec自动假设str为utf-8 unicode。一旦异常的字符串文字(除了unicodes)被编码为UTF-8。