V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jin7
V2EX  ›  问与答

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

  •  1
     
  •   jin7 · 2020-04-10 23:42:52 +08:00 · 1316 次点击
    这是一个创建于 1679 天前的主题,其中的信息可能已经有所发展或是发生改变。

    文件: 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, 就没问题.

    12 条回复    2020-04-11 11:17:12 +08:00
    ipwx
        1
    ipwx  
       2020-04-10 23:50:18 +08:00
    。。。因为 windoge 平台下面,文件默认以 local encoding 被解析啊。。。(比如中文 windoge 以 gbk 被解析)。

    但是你实际的常量是 utf-8 的。自然就报错了。
    Xusually
        2
    Xusually  
       2020-04-10 23:55:03 +08:00
    字符串编码问题吧。
    没细看,我 macOS 复制你帖子中的字符串保存后没有报错。
    估计原始文件的编码有问题。
    Jirajine
        3
    Jirajine  
       2020-04-11 00:00:37 +08:00
    先执行`chcp 65001`再运行试试?
    jin7
        4
    jin7  
    OP
       2020-04-11 00:00:43 +08:00
    好吧 `open('README.txt', 'r')` 在 windows 是也是默认用 gbk 编码打开文件 看来我存在误解, 以为 python 会把所有 py 脚本的编码视为 utf-8
    jin7
        5
    jin7  
    OP
       2020-04-11 00:01:31 +08:00
    @Jirajine #3 没效果
    jin7
        6
    jin7  
    OP
       2020-04-11 00:06:45 +08:00
    之前不是有人说 python3 加` # -*- coding: utf-8 -*- `没有必要了么, 现在看来还是有必要的....
    shakespark
        7
    shakespark  
       2020-04-11 00:12:09 +08:00 via iPhone
    先用 ultraedit 之类的工具把 py 文件本身的编码改成 utf8
    然后 open 的参数里加上 encoding utf8
    试试呢?
    jin7
        8
    jin7  
    OP
       2020-04-11 00:13:51 +08:00
    @shakespark #7 不是这个问题 这个没问题 文件: https://www.qsc.zju.edu.cn/box/-57009898
    Trim21
        9
    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
        10
    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
        12
    jin7  
    OP
       2020-04-11 11:17:12 +08:00
    多谢各位的回答
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2664 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:48 · PVG 23:48 · LAX 07:48 · JFK 10:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.