zoukankan      html  css  js  c++  java
  • Python脚本开头两行:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用

    转于: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(’xefxbbxbf’)的UTF-8

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

       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的。

  • 相关阅读:
    第三章web安全基础—IIS发布网站(其中包括服务器IIS搭建、DNS搭建)
    第三章web安全基础—web系统架构
    第二章网络协议安全—网络协议看安全
    第一章信息收集—漏洞利用框架metasploit基本实用
    第一章信息收集—漏洞扫描awvs和appscan
    第一章信息收集—扫描技术与抓包分析
    Pikachu——Unsafe Fileupload不安全文件上传
    Pikachu——Unsafe Filedownload 不安全的文件下载
    Pikachu——File Inclusion(文件包含)
    拿什么拯救你,红果果的小磁盘?
  • 原文地址:https://www.cnblogs.com/volcao/p/8820727.html
Copyright © 2011-2022 走看看