在写python时,有时会在文件头声明编码方式,如下:
# -*- coding: utf-8 -*-
有时又没有,似乎写不写都没关系。但实际上这样的想法是不行的,即便你没有上面的声明,Python将默认为ASCII标准编码,对python解释器来说两者相同,但对编辑器来说,就可能出现识别不了的问题。
官方文档PEP 263是这么描述的:
在Python 2.1中,只能使用基于Latin-1的编码“ unicode-escape”编写Unicode文字。
这使得编程环境对在许多亚洲国家/地区的非Latin-1语言环境中生活和工作的Python用户而言非常不利。
程序员可以使用最喜欢的编码来编写其8位字符串,但是绑定到Unicode文字的“ unicode-escape”编码
换句话说,默认的ASCII标准编码(规定了128个字符的编码),对于英文字母是足够的,但是对于非英语国家编码就显得复杂了起来(具体也可以搜索字符编码相关知识)。比如法语德语中还有注音,它们可以ASCII(总共256)中闲置的字符,但是对于更复杂的中文则还有专门的比如GB2312方式。
这样就针对每种语言都有各种各样的编码方式,有没有一种统一的能够囊括所有符号的编码方式呢?有,那就是Unicode。
Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字严。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
注意Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。于是UTF-8应运而生,成为在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示。
前面PEP263已经表明python支持utf-8方式,实现方式见本文开头,python官方则建议声明编码方式的同时声明解释器路径,
如下:
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
而一般简化的声明可以写成:
#coding=utf-8
或者
#coding:utf-8
只需要匹配以下正则表达式即可:
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)