文档章节

【原创】Python 源文件编码解读

摩云飞
 摩云飞
发布于 2013/09/26 22:33
字数 780
阅读 1414
收藏 42


以下内容源于对 PEP-0263 的翻译和解读,同时给出了一些网上网友的说法。

========  我是分割线 ========

原文地址:PEP 0263 -- Defining Python Source Code Encodings

【摘要】

      给出声明 Python 源文件编码的语法。该编码信息后续会被 Python 解析器用于解析源文件。
      这种方式增强了对源文件中 Unicode 编码字的处理。

【问题】

      Python 2.1 时代,Unicode 字符只能采用基于 Latin-1 字符进行“Unicode 转义”的方式来表示(也就是说当时只支持 Latin-1 字符编码,所以 Unicode 字符编码只能使用 Latin-1 字符来进行转义表示)。这对广大亚洲人民是很坑爹的。

【解决方案】

      通过在 Python 脚本文件的头部增加 显式的可按文件随时改变的 特殊注释,来声明编码方式。

【编码定义】

      Python 默认使用 ASCII 编码。
      若要自定义 Python 源码的编码方式,需要在脚本文件的第一或者第二行的位置上添加如下定义:
1. 方式一(第一行)

# coding=<encoding name>

2. 方式二(第二行)

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

3. 方式三(第二行)

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

在前两种方式中,实际上是通过 coding[:=]\s*([-\w.]+) 这个正则表达式来进行匹配。          

      为了支持 Windows 平台上的应用,会在生成的 Unicode 文件的头部添加 Unicode BOM 标识,其中带有 UTF-8 标识 '\xef\xbb\xbf' 的文件会被当做具有 UTF-8 编码的文件(此时在 Python 脚本的头部没有那行编码特殊注释也没问题) 。

      如果出现源文件同时使用了 UTF-8 BOM 标识和文件头部的特殊注释的情况,那么在表明编码的特殊注释中只能使用 'utf-8' 这个字串,其他情况会报错。

【举例】

1. Python 解析器说明 + Emacs 风格的文件编码注释

#!/usr/bin/python
# -*- coding: latin-1 -*-
import os, sys
...
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import os, sys
...
#!/usr/bin/python
# -*- coding: ascii -*-
import os, sys
...

2. 无 Python 解析器说明 + 普通明文描述

# This Python file uses the following encoding: utf-8
import os, sys
...

3. Python 解析器说明 + 非 Emacs 风格的文件编码注释

#!/usr/local/bin/python
# coding: latin-1
import os, sys
...

4. 无编码注释(Python 解析器默认为 ASCII)

#!/usr/local/bin/python
import os, sys
...

5. 错误的编码注释方式
a. 无 coding: 前缀

#!/usr/local/bin/python
# latin-1
import os, sys
...

b. 编码注释不在第一或第二行

#!/usr/local/bin/python
#
# -*- coding: latin-1 -*-
import os, sys
...

c. 使用不支持的编码

#!/usr/local/bin/python
# -*- coding: utf-42 -*-
import os, sys
...


=========== 我是分割线 ============

小实验截图:
输出中文。

报错。
添加编码。

正常输出。

IDE默认的编码设置。

各种转码输出。

输出的结果。




补充说明:
cp936即 code page 936(代码页936)是以GBK(国标扩展字符集)为基础的编码。GB2312(国标字符集)只是GBK的一部分。 GB2312只支持常用的汉字,而且是简体字。GBK支持繁体字和生僻字。

 

© 著作权归作者所有

共有 人打赏支持
摩云飞
粉丝 367
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中

评论(1)

伊藤熊吉
伊藤熊吉
目测pycharm
《Python3.6官方文档》– 第二章 使用python解释器

2.1. 调用解释器 Python解释器一般安装在 目录下,将 目录加入到Unix Shell脚本的命令搜索目录下,这样便可以通过输入以下shell命令已启动它[1]: 既然解释器的存放目录是安装时可选的,那么...

Skysper
01/12
0
0
Python2.x 字符编码终极指南

在人机交互之字符编码 一文中对字符编码进行了详细的讨论,并通过一些简单的小程序验证了我们对于字符编码的认识。但仅了解这篇文章的内容,并不能帮我们在日常编程中躲过一些字符编码相关的...

selfboot
2016/12/29
0
0
【原创】python词云分析陈粒和赵雷

未经同意禁止转载,否则通过维权骑士追究 【完整源代码请点击 此处 留言以获取,可以顺便给颗Star😄】 记录一个练习小项目,训练一下python分析技能。用到的知识有“爬虫”、“jieba分词”...

_SoLo_
06/30
0
0
Python 常用静态代码检查工具简介

对于我这种习惯了 Java 这种编译型语言,在使用 Python 这种动态语言的时候,发现错误经常只能在执行的时候发现,总感觉有点不放心。 而且有一些错误由于隐藏的比较深,只有特定逻辑才会触发...

不正经程序员
07/24
0
0
值得收藏的Python小技巧:这17个骚操作你都OK吗?

导读:Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短。在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧,例如查找、分割和合并列表等。这 17...

数据分析v
08/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

重磅!亚洲诚信实力斩获:“2018 DigiCert/Symantec 年度最佳创新合作伙伴”大奖

2018年11月13日-16日,全球顶级数字证书厂商,DigiCert/Symantec亚太区圆桌会议(Asia Partner Roundtable 2018)在日本大阪隆重召开。 亚洲诚信作为DigiCert/Symantec亚太区白金战略合作伙伴和...

亚洲诚信
23分钟前
2
0
始于阿里,回归社区:阿里8个项目进入CNCF云原生全景图

摘要: 一群技术理想主义者,与太平洋另一边的技术高手们正面PK,在这场躲不开的战役中,一起认真一把。 破土而出的生命力,源自理想主义者心底对技术的信念。 云原生技术正席卷全球,云原生...

阿里云官方博客
30分钟前
3
0
修改this指向(bind、call 和 apply)

一、bind bind 的其中一个用法就是:绑定函数,使其无论怎么样调用都用相同的 this 示例: var obj = { getThis: function() { console.log(this); }};obj.getThis()...

文文1
今天
1
0
WSL安装JDK8

下载地址 JDK_URL https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html UNLIMITED_STRENGTH_URL https://www.oracle.com/technetwork/java/javase/down......

terwergreen
今天
4
0
sparkStreaming基本概念

概述 Spark Streaming 是 Spark Core API 的扩展, 它支持弹性的, 高吞吐的, 容错的实时数据流的处理. 数据可以通过多种数据源获取, 例如 Kafka, Flume, Kinesis 以及 TCP sockets, 也可以通过...

freeli
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部