一.普通解释: 如果要在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]+).*$"

更多相关文章

  1. 使用自定义qemu二进制文件与libvirt失败?
  2. 【python coding 1:网络检测】ping本地文件里的ip地址
  3. python 中 字符串转换为数组,字典或表达式
  4. 如何输出NLTK块到文件?
  5. 使用python将图片转换为字符图片
  6. python 读写文本文件
  7. Python多行正则表达式忽略字符串中的n行
  8. 批量重命名文件——python实现
  9. 从正则表达式中浏览和提取字符类

随机推荐

  1. android保存文件到SD卡中
  2. 最新Android框架排行榜,上百项资源汇总!
  3. Android工程引用其他项目
  4. windwos安装Android(安卓)NDK(Native Dev
  5. @SuppressLint("NewApi")作用
  6. DDPush开源推送框架源码分析之APPServer
  7. Android(安卓)sdk安装目录中没有platform
  8. 【Android】ORM框架greenDao 3
  9. Android中AVD(Android(安卓)Virtual Devic
  10. Android(安卓)ZXing源码简化