语法错误:Unicode字符串中的编码声明

3

如果我在文件顶部使用一个类似于 #coding=utf-8 的魔法注释,会发生以下情况:

Traceback (most recent call last):
  File <string>, line 0
SyntaxError: encoding declaration in Unicode string

我真的没有做错任何事情。这是代码:

#coding=utf-8

string = raw_input()
chars = {}
for i in string:
    if i in chars:
        chars[i] += 1
    else:
        chars[i] = 0
print chars

我使用repl.it。

这是与编码有关,而不是编程。 - DeepSpace
@DeepSpace 请参考这里。当然可以使用 coding - EKons
1
@DeepSpace:不是这样的。它可能是“解码”、“错误编码”或者只是“编码”。使用的正则表达式并不在意。请参见“What's the difference between 'coding=utf8' and '-*- coding: utf-8 -*-'?”(https://dev59.com/wWIj5IYBdhLWcg3waEVe#20302074)。 - Martijn Pieters
@MartijnPieters 谢谢,好知道! - DeepSpace
你有没有偶然使用exec来运行这个程序?否则错误信息就没有意义了。 - Martijn Pieters
显示剩余3条评论
1个回答

13
您在问题中省略了一些内容:您正在使用exec来执行此代码。并且将一个Unicode对象传递给exec,这意味着您已经说明源是Unicode文本:
您在问题中省略了一些内容:您正在使用exec来执行此代码。并且将一个Unicode对象传递给exec,这意味着您已经说明源是Unicode文本:
>>> code = '''\
... # coding=utf8
... print 'hello world!'
... '''
>>> exec code
hello world!
>>> exec code.decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 0
SyntaxError: encoding declaration in Unicode string

如果您在向 exec 传递 Unicode 文本,则不能使用 PEP 263 声明。

如果您正在使用像repl.it这样的“自定义”环境,那么是的,这种环境无疑使用诸如exec之类的技巧来执行代码,并且从浏览器中以Unicode格式加载源代码。请参见实际使用的代码,它将从 JSON 源获取的字符串传递给 exec(在这种情况下,这些字符串始终将是 unicode 字符串)。


我认为解释器使用exec。先行致谢!+1 - EKons
@ΈρικΚωνσταντόπουλος:它确实可以在从JSON加载的Unicode字符串上运行;当读取sys.argv[0]时,实际脚本是很容易获取的。 - Martijn Pieters
我知道关于 sys.argv[0] 的内容。 - EKons
@ΈρικΚωνσταντόπουλος:我不是想暗示你没有,抱歉。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接