当您调用Python(2.7+)“exec”函数时,对解码提供的字符串输入需要做些什么假设或操作?
(通过比较 - 如果您希望项目中的源.py文件包含unicode,则必须在文件顶部嵌入“魔术序列”。)
我注意到exec似乎可以在字符串输入中找到unicode,即使我没有尝试在任何地方指示编码。
例如,我可以通过exec传递此字符串:
my_string = "That will cost you ¥ 800.00"
并且exec生成的结果my_string变量确实会包含Yen符号。所以出现 exec假设是utf-8?
迈克尔
答案 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。