【问题标题】:Correct way to define Python source code encoding定义Python源代码编码的正确方法
【发布时间】:2010-10-18 06:02:32
【问题描述】:

PEP 263 定义了如何声明 Python 源代码编码。

通常,Python 文件的前 2 行应以:

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

但我看到很多文件以:

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

=> encoding 而不是 coding

那么声明文件编码的正确方式是什么?

是否允许编码,因为使用的正则表达式是惰性的?还是只是声明文件编码的另一种形式?

我问这个问题是因为 PEP 不谈论编码,它只谈论编码

【问题讨论】:

  • 顺便说一下,为了获得更大的灵活性和便携性,建议使用#!/usr/bin/env python而不是#!/usr/bin/python
  • 我喜欢这个页面上的所有答案都没有一个简单的工作示例,比如 UTF8。 StackOverly 处于最佳状态。
  • 我只是想补充一点,Python 3 已将默认编码从ascii 更改为UTF-8。比较:python 2.7 docspython 3.7 docs。这意味着如果您想指定 UTF-8,您可以放心地省略此编码。

标签: python encoding


【解决方案1】:

PEP 263:

第一行或第二行必须匹配 常规的 表达式“编码[:=]\s*([-\w.]+)”

因此,“encoding: UTF-8”匹配。

PEP 提供了一些示例:

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

 

# This Python file uses the following encoding: utf-8
import os, sys

【讨论】:

    【解决方案2】:

    截至今天 - 2018 年 6 月


    PEP 263 本身提到了它遵循的正则表达式:

    要定义源代码编码,必须将魔术注释放入 源文件作为文件中的第一行或第二行,例如:

    # coding=<encoding name>
    

    或(使用流行编辑器认可的格式):

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

    或:

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

    更准确地说,第一行或第二行必须匹配以下正则表达式:

    ^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)
    

    因此,正如其他答案已经总结的那样,它将与 coding 匹配任何前缀,但如果您希望尽可能符合 PEP(尽管据我所知,使用 encoding 而不是 coding 不会以任何方式违反 PEP 263)— 坚持使用“普通”coding,没有前缀。

    【讨论】:

      【解决方案3】:

      只需将下面的语句复制粘贴到程序顶部即可解决字符编码问题

      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      

      【讨论】:

        【解决方案4】:

        查看文档here

        “如果 Python 脚本的第一行或第二行中的注释与正则表达式 coding[=:]\s*([-\w.]+) 匹配,则将此注释作为编码声明处理”

        "这个表达式的推荐形式是

        # -*- coding: <encoding-name> -*-
        

        它也被 GNU Emacs 识别,并且

        # vim:fileencoding=<encoding-name>
        

        被 Bram Moolenaar 的 VIM 识别。”

        因此,您可以在“编码”部分之前放置几乎任何内容,但如果您想 100% 兼容 python-docs-recommendation,请坚持使用“编码”(不带前缀)。

        更具体地说,您需要使用 Python 识别的任何内容以及您使用的特定编辑软件(如果它需要/接受任何内容)。例如。 coding 形式被 GNU Emacs 识别(开箱即用)但不是 Vim(是的,没有通用协议,它本质上是 turf war)。

        【讨论】:

        • -*- 确保该行被 GNU Emacs(一些程序员流行的文本编辑器)识别。请注意,与这个答案相反,Emacs 表单和 Vim 表单都是 100% python-docs-recommendation-compatible(因为它们都匹配正则表达式 - “匹配”,按照长期惯例,意味着“匹配string",与 Python 的 API 不同)。
        • Emacs 对嵌入式指令的具体要求记录在 gnu.org/software/emacs/manual/html_node/emacs/… 中。简而言之,文件开头的格式是:&lt;prefix&gt;-*- var: value[; ...] -*-.
        【解决方案5】:

        如果我没记错的话,最初对源文件编码的提议是在前几行使用正则表达式,这将允许两者。

        我认为正则表达式类似于coding:,然后是一些东西。

        我发现了这个:http://www.python.org/dev/peps/pep-0263/ 这是最初的提议,但我似乎找不到最终的规范说明他们做了什么。

        我确实使用了encoding:,效果非常好,所以很明显这是有效的。

        尝试更改为完全不同的内容,例如duhcoding: ...,看看是否也能正常工作。

        【讨论】:

          【解决方案6】:

          我怀疑它类似于 Ruby - 任何一种方法都可以。

          这主要是因为不同的文本编辑器使用不同的标记编码方法(即这两种)。

          对于 Ruby,只要第一个,或者第二个如果有 shebang 行包含匹配的字符串:

          coding: encoding-name
          

          并忽略这些行上的任何空格和其他绒毛。 (通常也可以是 = 而不是 :)。

          【讨论】:

            猜你喜欢
            • 2020-12-11
            • 2021-12-06
            • 1970-01-01
            • 1970-01-01
            • 2010-11-22
            • 2015-12-30
            • 2022-01-17
            相关资源
            最近更新 更多