Python 一个关于字符编码的诡异问题(Non-UTF-8 code starting with '\xe5')

2019-12-02 21:13:16 +08:00
 q3011893

先上代码 1:

s = """ 安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大 """
print(s)

执行代码 1,会报错:SyntaxError: Non-UTF-8 code starting with '\xe5' in file

再上代码 2:

s = """ 师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大安师大 """
print(s)

代码 2 就是把代码 1 的 s 字符串变量里,随便删一个字,比如删开头的,然后就可以成功打印结果了。

靠!!!这是什么鬼???就差一个字符就能有这么大的变化?

当然解决代码 1 还有种办法,就是文件头部加# -*- coding: utf-8 -*-,但是为什么呢?? python3 不就是默认 utf-8 的吗?


执行环境:

1、macos

2、vscode / sublime text 3 都不可以

3、python3.7 ( anaconda 的和自己编译装的 python 3.7 亲测都不行) [但是网页版的这个 “python 3 在线执行” 却可以 https://c.runoob.com/compile/9 ]

5881 次点击
所在节点    Python
14 条回复
ma6254
2019-12-02 21:23:45 +08:00
1.本地源文件什么格式?
2.这串字符里面是否有不可见字符
imn1
2019-12-02 21:25:45 +08:00
SyntaxError
这个极可能是.py 文件保存的格式有问题
我估计是 bom 的问题
Jirajine
2019-12-02 21:27:03 +08:00
试了一下,vscode 里执行默认有这么一行预处理${env:PYTHONIOENCODING}='UTF-8'; 所以并没有问题,直接在 powershell 终端执行复现,使用 wsl 里的 python 正常。然后删字依旧报错并不管用。
Trim21
2019-12-02 21:44:50 +08:00
@ma6254 #1 没有不可见字符...
lysS
2019-12-02 22:00:17 +08:00
好奇你为什么会写怎么一串东西。。。
JCZ2MkKb5S8ZX9pq
2019-12-02 22:28:42 +08:00
我是 sublime 出现这个情况需要满足多个条件。
我头部声明一般都保留,需要去掉声明才会报错。
同时我如果用的一个自定义 build,加了-um,也不会出现这个错误。

感觉开头的这个声明,在处理 utf8 的时候,直接就处理了逃逸,把\xe5 给解决掉了。
找了一下,好像依据是这个。
我理解就是不加这行话,py3 把文件当 utf8 来读,读到意外的字符就报错了。
加了这段话之后,多做了一步转义加成,于是把违禁字符先给解决了,然后才开始运行。

Handling of escape sequences should continue to work as it does now, but with all possible source code encodings, that is standard string literals (both 8-bit and Unicode) are subject to escape sequence expansion while raw string literals only expand a very small subset of escape sequences.

[PEP 263 -- Defining Python Source Code Encodings | Python.org]( https://www.python.org/dev/peps/pep-0263/)
JCZ2MkKb5S8ZX9pq
2019-12-02 22:31:05 +08:00
我是直接写了个 python 的 snippet,自动模板。
开头加两行
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

之前也没多想,就放着呗。
ggicci
2019-12-02 23:45:32 +08:00
一没说操作系统,二没说文件编码,查 bug 全靠猜吗?佛的了。。。
wangyzj
2019-12-03 01:05:25 +08:00
命令行直接 python 测试你的两个代码都没问题
所以应该不是代码问题
ClericPy
2019-12-03 09:12:59 +08:00
在 Windows 上用藏文试过, 除了 shebang 加 coding, 没有任何其他办法, 死了这条心吧
j0hnj
2019-12-03 11:56:06 +08:00
windows 下命令行测试,两个都没问题


@ggicci #8 人家说了操作系统的
j0hnj
2019-12-03 12:01:08 +08:00
从楼主的描述来看,我严重怀疑漏洞搞错了 python 版本,楼主执行的应该是 python2
datou
2019-12-03 15:28:24 +08:00
win10 下 py36,py37,py38 都没问题
lolizeppelin
2019-12-05 15:37:48 +08:00
WINHEX 用二进制打开文件对比你就知道什么问题了

瞎猜个什么劲

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/625251

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX