关于Python的编码注释# -*- coding:utf-8 -*- 详解

时间:2023-01-05 09:46:52

一.普通解释:                                                                                                                                                                                                                      如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码。

二.官方解释:

1. python2.1中遇到的问题:

Python 2.1 中,想要输入 Unicode 字符,只能用基于 Latin-1 的 "unicode-escape" 的方式输入 -> 对于其他非 Latin-1 的国家和用户,想要输入 Unicode 字符,就显得很繁琐,不方便。

希望是:编程人员,根据自己的喜好和需要,以任意编码方式输入字符串,都可以,这样才正常。

2. 建议选用的方案

所以,才有人给 Python 官方建议,所以才有此PEP 0263。

此建议就是:

允许在 Python 文件中,通过文件开始处的,放在注释中的,字符串形式的,声明,声明自己的 python 文件,用何种编码。

由此,需要很多地方做相应的改动,尤其是 Python 文件的解析器,可以识别此种文件编码声明。

3 具体如何声明python文件编码?

(1)如果没有此文件编码类型的声明,则 python 默认以ASCII编码去处理;如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的 python 文件,自然就会报错了。

(2)必须放在python文件的第一行或第二行;

(3)支持的格式,可以有三种:

  1. 带等于号的:
    # coding=<encoding name>
  2. 最常见的,带冒号的(大多数编辑器都可以正确识别的):
    #!/usr/bin/python
    # -*- coding: <encoding name> -*-
  3. vim的:
    #!/usr/bin/python
    

    # vim: set fileencoding=<encoding name> :

(4)更加精确的解释是:

    符合正则表达式:"^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)" 就可以;

关于正则表达式的理解:

1."^"表示开始;

2."[ \t\v]"表示匹配制表符\t和垂直制表符\v,*表示匹配0次或者多次,则[ \t\v]*合起来理解就是匹配0次或者多次\t\v;

3."#"匹配#字符,即对应标题的#字符;

4.".*"表示接下来匹配任意字符,".*?"表示以非贪心算法匹配任意字符,对应标题中的“ -*- ”;

5."coding"对应标题中的coding;

6."[:=]"表示接下来的字符是":"或者"="出现的任意多个字符,对应标题中的":";

7.[ \t]*表示接下来匹配0次或者多次\t;标题中表示使用了0次;

8.[-_.a-zA-Z0-9]表示匹配出现'_'字符、小写字母'a至z'、大小字母'A至Z'、数字‘0至9’的任意多的字符,对应标题中的utf-8

9.接下来标题中的" -*- "则这个官方表达式没有给出解释,因此这个正则表达式应该是不完整的,我觉得完整的正则表达式可以为:

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