码迷,mamicode.com
首页 > 编程语言 > 详细

PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)

时间:2018-11-18 02:13:07      阅读:341      评论:0      收藏:0      [点我收藏+]

标签:子集   win   inf   默认   vim   字符   编辑   没有   可变   

官方文档:https://www.python.org/dev/peps/pep-0263/

概要

这个PEP建议引入一个语法来声明Python源文件的编码。 Python解析器将使用这个编码信息中给定的编码来解释文件。 最引人注意的是,这增强了源代码中Unicode字符的解释。

 

问题描述

在Python 2.1中,Unicode字符只能使用基于Latin-1的“unicode-escape”编码编写。 这对生活和工作在非Latin-1语言环境(如许多亚洲国家)的Python用户来说是不友好的。 程序员可以使用最喜欢的编码来编写他们的8位字符串,但是他们被绑定到非得使用“unicode-escape”来编码Unicode字符。

 

解决方案

我建议在python源代码文件顶部的使用特殊注释来声明编码,使Python源代码的编码在每个源文件的基础上可见和可变。

为了使Python解释器意识到这个编码声明,在处理Python源代码数据方面需要进行一些概念更改。

 

定义编码

如果没有给出其他编码提示,Python将默认将ASCII作为标准编码。

要定义源代码编码,必须将编码声明放在源文件中,或者作为文件中的第一行或第二行,例如:

#coding=<encoding name>

 

或(使用各种流行的编辑器都认可的格式):

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

 

或者

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

更准确地说,第一行或第二行必须与以下正则表达式相匹配:

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

 

此表达式的第一组然后解释为编码名称。 如果编码对于Python是未知的,编译过程中会出现错误。 在包含编码声明的行上不能有任何Python语句。 如果第一行匹配第二行被忽略。

为了帮助那些将Unicode BOM标记添加到Unicode文件的开头的操作系统,比如Windows的平台,,UTF-8签名\ xef \ xbb \ xbf也将被解释为’utf-8’编码(即使没有编码声明中 给出)。

如果源文件使用UTF-8 BOM标记签名和编码声明,则该文件的唯一允许的编码为“utf-8”。 任何其他编码都会导致错误。

 

示例

1.设置其他非utf-8字符

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
print(阿甘)
 

结果:

技术分享图片

 

 

 2.设置utf-8字符

#!/usr/local/bin/python
# coding:utf-8
print(阿甘)

结果:

技术分享图片

 

3.设置没有的字符

#!/usr/local/bin/python
# coding:utf-88
print(阿甘)

 

结果:

技术分享图片

 

概念

PEP基于以下概念,必须实现这些概念才能使用这种注释:

1.完整的Python源代码文件应该使用单一编码。不允许嵌入不同编码的数据,在编译Python源代码时将导致解码错误。

任何允许以上述方式处理前两行的编码都可以作为源代码编码,这包括ASCII兼容编码以及某些多字节编码,比如Shift_JIS,unicode。它不包括对所有字符(如UTF-16)使用两个或多个字节的编码。这样做的原因是为了使标记器中的编码检测算法保持简单 。

2.转义序列的处理应该像现在一样继续工作,但是对于所有可能的源代码编码,即标准字符串字面量(8位和Unicode)都可以进行转义序列扩展,而原始字符串字面量只扩展了转义序列的一个非常小的子集。

 

3.python的编译器将进行如下的转换工作:

A.读取文件

B.将其解码为Unicode,假设每个文件有固定的编码

C.将其转换为UTF-8字节字符串

D.处理UTF-8的内容

E.编译它,从给定的Unicode数据中创建Unicode对象,并通过使用给定的文件编码将UTF-8数据重新编码为8 位字符串数据,从Unicode文字数据创建字符串对象

 请注意,Python标识符仅限于编码的ASCII子集,因此不需要在步骤之后进行进一步的转换

 

reference:https://blog.csdn.net/u013793383/article/details/73369315

 看看完后,又可以补编码的知识了!??

 个人学习笔记,翻译有限,理解翻译之错,请指教!

PEP 263 -- Defining Python Source Code Encodings(定义Python源代码编码)

标签:子集   win   inf   默认   vim   字符   编辑   没有   可变   

原文地址:https://www.cnblogs.com/ganiner/p/9976552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!