关于Python的编码注释# -*- coding:utf-8 -*- 详解

在Python2中,为了正确处理中文字符,需要在文件头部声明编码方式。本文详细介绍了编码声明的必要性、官方建议及三种常见声明格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.普通解释: 如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码。

二.官方解释:

  1. python2.1中遇到的问题:

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

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

  1. 建议选用的方案
    所以,才有人给 Python 官方建议,所以才有此PEP 0263。

此建议就是:

允许在 Python 文件中,通过文件开始处的,放在注释中的,字符串形式的,声明,声明自己的 python 文件,用何种编码。

由此,需要很多地方做相应的改动,尤其是 Python 文件的解析器,可以识别此种文件编码声明。

3 具体如何声明python文件编码?
(1)如果没有此文件编码类型的声明,则 python 默认以ASCII编码去处理;如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的 python 文件,自然就会报错了。

(2)必须放在python文件的第一行或第二行;

(3)支持的格式,可以有三种:
带等于号的:

# coding=<encoding name>

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

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

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]+).*$"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值