【转载】关于Python脚本开头两行的:#!/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
在此,详细的(主要是翻译)解释一下,为何要加这个编码声明,以及如何添加编码声明:
2.1 使用文件编码声明以前所遇到的问题
Python 2.1 中,想要输入 Unicode 字符,只能用基于 Latin-1 的 "unicode-escape" 的方式输入 -> 对于其他非 Latin-1 的国家和用户,想要输入 Unicode 字符,就显得很繁琐,不方便。
希望是:
编程人员,根据自己的喜好和需要,以任意编码方式输入字符串,都可以,这样才正常。
2.2 建议选用的方案
所以,才有人给 Python 官方建议,所以才有此PEP 0263。
此建议就是:
允许在 Python 文件中,通过文件开始处的,放在注释中的,字符串形式的,声明,声明自己的 python 文件,用何种编码。
由此,需要很多地方做相应的改动,尤其是 Python 文件的解析器,可以识别此种文件编码声明。
2.3 具体如何声明python文件编码?
上面已经说了,是,文件开始处的,放在注释中的,字符串形式的,声明。
那具体如何声明,以什么样的格式去声明呢?
其实就是,你之前就见过的,这种:
- # -*- coding: utf-8 -*-
对此格式的详细解释是:
- 如果没有此文件编码类型的声明,则 python 默认以ASCII编码去处理;如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的 python 文件,自然就会报错了。
- 必须放在python文件的第一行或第二行
- 支持的格式,可以有三种:
- 带等于号的:
- # coding=<encoding name>
- 最常见的,带冒号的(大多数编辑器都可以正确识别的):
- #!/usr/bin/python
- # -*- coding: <encoding name> -*-
- #!/usr/bin/python
- vim的:
- #!/usr/bin/python
- # vim: set fileencoding=<encoding name> :
- #!/usr/bin/python
- 带等于号的:
- 更加精确的解释是:
- 符合正则表达式:
- "^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)"
- 的都可以,很明显,如果你熟悉正则表达式,也就可以写出来,其他一些合法的编码声明,以 utf-8 为例,比如:
- coding: utf-8
- coding=utf-8
- coding= utf-8
- encoding:utf-8
- crifanEncoding=utf-8
- coding: utf-8
- 符合正则表达式:
- 为了照顾特殊的Windows中的带BOM(’\xef\xbb\xbf’)的UTF-8:
如果你的python文件本身编码是带 BOM 的 UTF-8,即文件前三个字节是:’\xef\xbb\xbf’,那么:
- 即使你没有声明文件编码,也自动当做是UTF-8的编码
- 如果你声明了文件编码,则必须是声明了(和你文件编码本身相一致的)UTF-8,否则(由于声明的编码和实际编码不一致,自然)会报错
2.4 文件编码声明的各种例子
针对上面的规则,下面给出各种,合法的,非法的,例子,供参考:
2.4.1 合法的python文件编码声明
- 带声明了解释器的,Emacs风格的,(注释中的)文件编码声明
例子1:
- #!/usr/bin/python
- # -*- coding: latin-1 -*-
- import os, sys
- ...
例子2:
- #!/usr/bin/python
- # -*- coding: iso-8859-15 -*-
- import os, sys
- ...
例子3:
- #!/usr/bin/python
- # -*- coding: ascii -*-
- import os, sys
- ...
- #!/usr/bin/python
- 不带声明了解释器的,直接用纯文本形式的:
- #!/usr/bin/python
- # -*- coding: iso-8859-15 -*-
- import os, sys
- ...
- #!/usr/bin/python
- 文本编辑器也可以有多种(其他的)定义编码的方式:
- #!/usr/local/bin/python
- # coding: latin-1
- importos, sys
- ...
很明显,其中的没用-*-,直接用了coding加上编码值
- #!/usr/local/bin/python
- 不带编码声明的,默认当做ASCII处理:
- #!/usr/local/bin/python
- import os, sys
- ...
- #!/usr/local/bin/python
2.4.2 非法的python文件编码声明举例
- 少了coding:前缀
- #!/usr/local/bin/python
- # latin-1
- import os, sys
- ...
- #!/usr/local/bin/python
- 编码声明不在第一行或第二行:
- #!/usr/local/bin/python
- #
- # -*- coding: latin-1 -*-
- import os, sys
- ...
- #!/usr/local/bin/python
- 不支持的,非法的字符编码(字符串)声明:
- #!/usr/local/bin/python
- # -*- coding: utf-42 -*-
- import os, sys
- ...
- #!/usr/local/bin/python
2.5 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. |
2.这段也不太懂:
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. |
3.Python的分词器+编译器,会按照如下的逻辑去工作:
- 读取文件
- 不同的文件,根据其声明的编码去解析为Unicode
- 转换为UTF-8字符串
- 针对UTF-8字符串,去分词
- 编译之,创建Unicode对象
要注意的是:
Python中的标识符,都是ASCII的。
其余的内容,不翻译了。
至此,已经解释的够清楚了。
【转载】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型的更多相关文章
- Python脚本开头两行:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
转于:https://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ 出处:在路上 一.基本功能 1)#!/us ...
- 【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
原文网址:http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用 ...
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
#!/usr/bin/python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的PEP 0263 -- Defining P ...
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 转
#!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的. # -*- ...
- Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
#!/usr/bin/Python指定用什么解释器运行脚本以及解释器所在的位置 # -*- coding: utf-8 -*-用来指定文件编码为utf-8的 估计有不少人注意过一些python脚本开头 ...
- (二)Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用
#!usr/bin/env python # -*- coding: utf-8 -*- def test(): print('hello, world') if __name__ == " ...
- 关于python脚本头部设置#!/usr/bin/python
今天又是贼几把菜的一天0.0 读别人程序的时候看到在python文件头部设置签名,感觉贼几把酷,自己也试着在文件前段设置了一下. 设置还是蛮简单的,设置过程如图所示. 设置后如图所示: 当然你也可能看 ...
- #!/usr/bin/env python与#!/usr/bin/python的区别
[摘自:http://blog.csdn.net/wh_19910525/article/details/8040494] 一般的python文件的开头都有#!/usr/bin/python.这是什么 ...
- Python程序 #!/usr/bin/python 的解释
关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器 ...
随机推荐
- Labeling Balls(拓扑排序wa)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12466 Accepted: 3576 D ...
- as3用鼠标拖动图形拼图——灰常简单的教程
话说这种效果在课件里面经常用到,鼠标拖动事件,一个运用很频繁的事件,一起学习学习吧 首先SWF贡献给大家看看效果 感觉咋样,原理其实还蛮简单的,做做试试吧 下面来看看源码吧 package { imp ...
- 请问下mtk双卡手机怎样发短信是怎样选择sim卡来发(双卡都可用的情况下)?
如题,我如今可以获取双卡状态,当仅仅有单一卡的时候可以指定sim卡进行发短信,可是双卡都可用的情况下,程序就默认使用卡1发短信了.即使指定了sim卡编号.
- C. Table Decorations(Codeforces Round 273)
C. Table Decorations time limit per test 1 second memory limit per test 256 megabytes input standard ...
- 关于Scrapy框架的基本概念
Scrapy爬取网页基本概念 Scrapy爬取网页基本概念 怎么样用Scrapy生成project? scrapy startproject xxx 如何用Scrapy爬取网页? import scr ...
- 常用Android快速开发框架
在做项目的过程中遇到了很多困难,于是收集了一些快速开发的框架,使用后大大提高了项目开发速度,无论什么项目都可以使用的到,在此分享给大家,希望能对大家有帮助!(个人建议:有时间的同学可以看一下这些优秀框 ...
- HTTP 错误 401.3 - Unauthorized由于 Web 服务器上此资源的访问控制列表(ACL)解决办法
对应站点目录的IUSR的权限没设造成的...在属性——>安全——> 高级 中把IUSR用户找出来添加好就OK了 注:IUSR(匿名访问 Internet 信息服务的内置帐户)
- JAVA泛型接口
事例代码: package com.xt.thins_15_3; import java.util.Iterator; /** * 泛型接口 * * @author xue * * @param &l ...
- php保留小数格式的多种方法
php保留小数格式,定义小数格式,小数点,位数,小数位数: 方法一:(推荐)bcmul(1000.90,1,2);//两个数相乘1000.90*1, 保留两位小数点(无四舍五入)<返回strin ...
- 第一次当Uber司机,就拉到漂亮妹纸
黑马哥的Uber司机端装上很久了,一次活儿也没拉,心里一直有一种当“张师傅”的冲动.黑马哥当Uber司机,肯定不是为了图挣钱,也不是因为Uber有“新约炮神器”的称号,能通过“拉活”来泡妹纸.黑马哥体 ...