转于:https://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/

出处:在路上

一、基本功能

 1)#!/usr/bin/python

  作用:用来说明脚本语言是python,要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。

 2)# -*- coding: utf-8 -*-

  作用:用来指定文件编码为utf-8

  详情可以参考:PEP 0263 — Defining Python Source Code Encodings

二、为何要加这个编码声明,以及如何添加编码声明?

 1)使用文件编码声明以前所遇到的问题

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

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

 2)建议选用的方案

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

  此建议就是:允许在Python文件中,通过文件开始处的,放在注释中的,字符串形式的,声明,声明自己的python文件,用何种编码。由此,需要很多地方做相应的改动,尤其是Python文件的解析器,可以识别此种文件编码声明。

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

 #上面已经说了,是,文件开始处的,放在注释中的,字符串形式的,声明。

 1)注意事项

1
# -*- coding: utf-8 -*-

  对此格式的详细解释是:

   A、如果没有此文件编码类型的声明,则python默认以ASCII编码去处理

   B、如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的python文件,自然就会报错了。

   C、必须放在python文件的第一行或第二行

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

  A、带等于号的:

1
# coding=<encoding name>

  B、最常见的,带冒号的(大多数编辑器都可以正确识别的):

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

  C、vim的:

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

  #更加精确的解释是,符合正则表达式:

1
"coding[:=]\s*([-\w.]+)"

   ==>如果你熟悉正则表达式,也就可以写出来,其他一些合法的编码声明,以utf-8为例,比如:

1
2
3
4
5
coding:         utf-8
coding=utf-8
coding=                  utf-8
encoding:utf-8
crifanEncoding=utf-8

 3)Windows中的带BOM(’\xef\xbb\xbf’)的UTF-8

  如果你的python文件本身编码是带BOM的UTF-8,即文件前三个字节是:’\xef\xbb\xbf’,那么:

   A、即使你没有声明文件编码,也自动当做是UTF-8的编码;

   B、如果你声明了文件编码,则必须是声明了(和你文件编码本身相一致的)UTF-8,否则(由于声明的编码和实际编码不一致,自然)会报错

四、文件编码声明的各种例子

 1)合法的python文件编码声明

   A、带声明了解释器的,Emacs风格的,(注释中的)文件编码声明

    例1:

1
2
3
4
#!/usr/bin/python
# -*- coding: latin-1 -*-
importos, sys
...

    例2:

1
2
3
4
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
importos, sys
...

    例子3:

1
2
3
4
#!/usr/bin/python
# -*- coding: ascii -*-
importos, sys
...

   B、不带声明了解释器的,直接用纯文本形式的:

1
2
3
# This Python file uses the following encoding: utf-8
importos, sys
...

   C、文本编辑器也可以有多种(其他的)定义编码的方式:

1
2
3
4
#!/usr/local/bin/python
# coding: latin-1
importos, sys
...

   D、不带编码声明的,默认当做ASCII处理:

1
2
3
#!/usr/local/bin/python
importos, sys
...

 2)非法的python文件编码声明举例

    A、少了coding:前缀

1
2
3
4
#!/usr/local/bin/python
# latin-1
import os, sys
...

    B、编码声明不在第一行或第二行:

1
2
3
4
5
#!/usr/local/bin/python
#
# -*- coding: latin-1 -*-
importos, sys
...

    C、不支持的,非法的字符编码(字符串)声明:

1
2
3
4
#!/usr/local/bin/python
# -*- coding: utf-42 -*-
importos, sys
...

五、python文件编码声明所遵循的理念

 1)单个的完整的python源码文件中,只用单一的编码

  ->不允许嵌入了多种的编码的数据,否则会导致(python解释器去解析你的python文件时)报编码错误。

  不太懂这段:

Any encoding which allows processing the first two lines in the way indicated above is allowed as source code encoding, this includes ASCII compatible encodings as well as certain multi-byte encodings such as Shift_JIS. It does not include encodings which use two or more bytes for all characters like e.g. UTF-16. The reason for this is to keep the encoding detection algorithm in the tokenizer simple.

  这段也不太懂:

Handling of escape sequences should continue to work as it does now, but with all possible source code encodings, that is standard string literals (both 8-bit and Unicode) are subject to escape sequence expansion while raw string literals only expand a very small subset of escape sequences.

 2)Python的分词器+编译器,会按照如下的逻辑去工作:

  1. 读取文件
  2. 不同的文件,根据其声明的编码去解析为Unicode
  3. 转换为UTF-8字符串
  4. 针对UTF-8字符串,去分词
  5. 编译之,创建Unicode对象

 3)要注意的是:

  Python中的标识符,都是ASCII的。

Python脚本开头两行:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用的更多相关文章

  1. 关于python脚本头部设置#!/usr/bin/python

    今天又是贼几把菜的一天0.0 读别人程序的时候看到在python文件头部设置签名,感觉贼几把酷,自己也试着在文件前段设置了一下. 设置还是蛮简单的,设置过程如图所示. 设置后如图所示: 当然你也可能看 ...

  2. 调用python脚本报错/usr/bin/env: python : No such file or directory

    一.调用python脚本报错 /usr/bin/env: python: No such file or directory 二.解决方法 原因是在windows上编写的脚本,使用dos2unix对脚 ...

  3. Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用

    #!/usr/bin/Python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的 估计有不少人注意过一些python脚本开头 ...

  4. 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    #!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...

  5. 【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用 ...

  6. 【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

    1.#!/usr/bin/python 是用来说明脚本语言是 python 的 是要用 /usr/bin下面的程序(工具)python,这个解释器,来解释 python 脚本,来运行 python 脚 ...

  7. (二)Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用

    #!usr/bin/env python # -*- coding: utf-8 -*- def test(): print('hello, world') if __name__ == " ...

  8. 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 转

    #!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的. # -*- ...

  9. #!/usr/bin/python和#!/usr/bin/env 的区别

    #!/usr/bin/python 通常在一个.py文件开头都会有这个语句 它只在Linux系统下生效,意思是当作为可执行文件运行时调用的解释器的位置上面代码的意思是调用/usr/bin/下的Pyth ...

随机推荐

  1. python cookbook第三版学习笔记十六:抽象基类

    假设一个工程中有多个类,每个类都通过__init__来初始化参数.但是可能有很多高度重复且样式相同的__init__.为了减少代码.我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中 ...

  2. Docker容器部署tomcat出现中文乱码

    docker 容器部署tomcat后,日志文件中出现中文乱码,很多问号,中文的文件夹也是问好.先看看容器的locale: [root@docker1 ~]# docker exec -it 41de9 ...

  3. Linux基础系列:常用命令(8)_shell script

    一.什么是shell script 将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了. 再加上些智能(条件/流控)控制,就变成了智能化脚本了 二.变量命名规则 以字母或下 ...

  4. Example 2 - contour plots

    load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" begin cdf_file = addfile("$N ...

  5. 【八】MongoDB管理之分片集群实践

    MongoDB中集群有三种:主从复制.副本集.分片集群.目前副本集已经替代主从复制架构,成为官方建议采用的架构,而分片集群相较于前两种,更加复杂. 下面是生产环境中常用的分片集群架构: 我们知道,分片 ...

  6. 系统安装记录 install OS

    上个系统很乱,基本系统是lfs7.7,上面应用都是基于lfs7.9,基本系统是才接触lfs时搭建的,打包保存后一直没怎么使用过,到lfs7.10快出来的时候有段时间有空就拿出来跑了一下,安装了一些软件 ...

  7. Ubuntu14 下安装jdk1.8

    1.oracle官网下载jdk-8u45-linux-i586.gz 此为32位 2.放在任意目录下,如/home/hongxf 3.直接解压该文件 sudo tar -xvf jdk-8u45-li ...

  8. java入门了解13

    小知识点: 网络编程:主要解决计算机间数据传输 不需要html页面可以达到数据传输:QQ,微信 网页编程:继续Html页面基础上数据交互:OA,天猫... java方向:web方向,annrod常用S ...

  9. LINQ 学习路程 -- 查询操作 where

    1.where Filtering Operators Description Where Returns values from the collection based on a predicat ...

  10. meta 标签代码解决IE兼容问题,IE6,IE7,IE8,IE9,IE10(包括360的兼容模式)

    最近做了一个项目,客户反映,在360下布局错位,远程调试了一下,发现客户使用的是360的兼容模式,然而我在自己的电脑上测试的时候是正常的(兼容模式也正常):简单研究了一下360的兼容模式,在360的兼 ...