关于 python 源码编码的小疑惑?

2016-09-18 10:46:36 +08:00
 shalk

按照 https://www.python.org/dev/peps/pep-0263/ 给出了编码定义,格式应该如下

such as:

      # coding=<encoding name>

or (using formats recognized by popular editors)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

or

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> 

我有几个疑问

  1. # coding=utf-8# coding=UTF-8 有什么区别

  2. 源码使用 utf-8 情况下,应该使用 without BOM 么,为什么?

  3. 这种是错误的么,生效么

    # -*- encoding:  UTF-8 -*-
    
2990 次点击
所在节点    Python
15 条回复
wellsc
2016-09-18 10:51:57 +08:00
You are so 闲。
julyclyde
2016-09-18 14:27:49 +08:00
# 没区别
# 因为 BOM 影响 hashbang 的判读
# 看起来是正确的啊
shalk
2016-09-18 15:44:09 +08:00
@julyclyde encoding 和 coding 看上去不一样啊。 PEP 中也没提到有 encoding:这种写法
zhuangzhuang1988
2016-09-18 16:25:46 +08:00
看 python 源码就知道了..
bombless
2016-09-18 16:37:01 +08:00
参考了下 https://github.com/python-git/python/blob/715a6e5035bb21ac49382772076ec4c630d6e960/Lib/idlelib/IOBinding.py
1 肯定是没区别, 2 的话代码里面有说, 2.3 才开始支持, 3 的话可以,代码里面用到
glasslion
2016-09-18 16:47:35 +08:00
@shalk
实测 1 , 3 里的写法都不会报错, 但这和 CPython 的实现有关, 不应该使用 PEP 263 里没提到的格式

2. 应该使用不带 BOM 的。 BOM 本来就是针对 utf-16 实现一个十分丑陋的方案。 utf-8 里使用 BOM 没有任何意义。
Kisesy
2016-09-18 17:29:56 +08:00
utf-8 和 UTF-8 没区别,甚至写成 utf8 和 u8 都行
julyclyde
2016-09-18 17:30:37 +08:00
@shalk 看上去确实不一样。不过你到底仔细读了 PEP 了没?
fugees
2016-09-18 17:51:27 +08:00
蛋痛的厉害吧
我一直用 # encoding: utf-8
jiangbingo
2016-09-18 17:59:25 +08:00
对了 ,写脚本文件一定要将 -*- encoding:utf-8-*- 写在代码开始的第一行。不然会报编码错~
tmackan
2016-09-18 18:22:02 +08:00
@wellsc 哈哈哈
shalk
2016-09-18 18:28:21 +08:00
@bombless 感谢分享

另外,我在源码中没有找到关于大小写 区分的 解释;

我看到 `def coding_spec` 解析源码的开头两行,返回编码的 name ;之后用 return unicode(chars, enc) 解码成 unicode 。

我自己试了一下。

```
>>> a="啊啊"
>>> unicode(a,"utf-8")
u'\u554a\u554a'
>>> unicode(a,"UTF-8")
u'\u554a\u554a'
```

另外又看了一下 https://docs.python.org/2/library/codecs.html#standard-encodings

也没有找到关于大小写的解释..
tmackan
2016-09-18 18:30:26 +08:00
@shalk 哥们,你扣的太细了吧 ==
shalk
2016-09-18 18:31:09 +08:00
@Kisesy 果然是这样。

还是可以是 utf ,或者下面这几个。
```
# utf_8 codec
'u8' : 'utf_8',
'utf' : 'utf_8',
'utf8' : 'utf_8',
'utf8_ucs2' : 'utf_8',
'utf8_ucs4' : 'utf_8',
```
shalk
2016-09-18 18:32:55 +08:00
@tmackan 也想学习 python 的方方面面。 ^_^

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

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

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

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

© 2021 V2EX