python3 不是默认所有字符串都是 unicode 编码么, 为啥这段话有毒, 文件编码 utf-8 没有 bom, python3.7.5, windows10, 是保存到文件再运行, 不是直接复制到 Python 终端运行.

2020-04-10 23:42:52 +08:00
 jin7

文件: https://www.qsc.zju.edu.cn/box/-57009898

s = '但在许多人眼里是羞耻的是隐秘的视为了一会对大多数个开音加以独自生活一点“总就《和陌生人说话》栏老过好几次他非常直白地表示来公园就是为了甚至坦言自己最疯狂的时候其实这背后隐藏的是孤独寂寞是对和陪伴的渴望希望大家在面对老年人生活时不要戴着有色眼镜去看待而是去正视他们的需求往往老年人的需求被忽视、不被理解带来的一个结果就是老年人耻于谈也没人告诉著作'
print(s)

保存为脚本文件, 如 test.py, 然后运行就会报错

文件编码 utf-8 没有 bom, python3.7.5, windows10

python3 test.py

File "test.py", line 1
SyntaxError: Non-UTF-8 code starting with \xe5' in file test.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

文件开头加上注释 # -*- coding: utf-8 -*- 或者文件编码修改为 utf-8 有 bom, 就没问题.

1338 次点击
所在节点    问与答
12 条回复
ipwx
2020-04-10 23:50:18 +08:00
。。。因为 windoge 平台下面,文件默认以 local encoding 被解析啊。。。(比如中文 windoge 以 gbk 被解析)。

但是你实际的常量是 utf-8 的。自然就报错了。
Xusually
2020-04-10 23:55:03 +08:00
字符串编码问题吧。
没细看,我 macOS 复制你帖子中的字符串保存后没有报错。
估计原始文件的编码有问题。
Jirajine
2020-04-11 00:00:37 +08:00
先执行`chcp 65001`再运行试试?
jin7
2020-04-11 00:00:43 +08:00
好吧 `open('README.txt', 'r')` 在 windows 是也是默认用 gbk 编码打开文件 看来我存在误解, 以为 python 会把所有 py 脚本的编码视为 utf-8
jin7
2020-04-11 00:01:31 +08:00
@Jirajine #3 没效果
jin7
2020-04-11 00:06:45 +08:00
之前不是有人说 python3 加` # -*- coding: utf-8 -*- `没有必要了么, 现在看来还是有必要的....
shakespark
2020-04-11 00:12:09 +08:00
先用 ultraedit 之类的工具把 py 文件本身的编码改成 utf8
然后 open 的参数里加上 encoding utf8
试试呢?
jin7
2020-04-11 00:13:51 +08:00
@shakespark #7 不是这个问题 这个没问题 文件: https://www.qsc.zju.edu.cn/box/-57009898
Trim21
2020-04-11 00:19:14 +08:00
试了一下直接用 open('a.py', encoding='utf8')读取文件是能正常读取的

文件不是以 gbk 解析的,没有注释标明 encoding 的文件是以 utf8 解析的,只不过可能 windows 上面是 utf8 with bom,所以在这个字符串(\xe4\xbd\x86\xe5\x9c...)截取掉前三个字节的开头'\xe5'报错了
imn1
2020-04-11 00:34:16 +08:00
我来杠一下,🐶
因为在解析为字符串之前就出错了(还没赋值给变量 s ),所以读取.py 文件到成为 s 字符串之间只能叫字节

无编码声明的文件,按 latin-1 读取,第一个汉字按 latin-1 是“ä½å”( E4 BD 86 )都可以视为合法字符
第二个汉字首字节是 E5,就不能解析为合法字符了

带 utf-8 bom 的.py 文件,在 windows 平台,python 直接视为 utf-8,无需声明(声明为其他编码也会被无视)
jin7
2020-04-11 10:53:03 +08:00
jin7
2020-04-11 11:17:12 +08:00
多谢各位的回答

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

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

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

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

© 2021 V2EX