文档章节

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

摩云飞
 摩云飞
发布于 2013/09/26 22:33
字数 780
阅读 1411
收藏 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支持繁体字和生僻字。

 

© 著作权归作者所有

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

评论(1)

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

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

Skysper
01/12
0
0
【原创】python词云分析陈粒和赵雷

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

_SoLo_
06/30
0
0
学习python处理python编码问题

一、几种常见的编码格式。 1.1、ascii,用1个字节表示。 1.2、UTF-8,用1个至三个字节表示,表示ascii码时只占用1个字节,ascii编码是UTF-8的子集。 1.3、UTF-16,用2个字节表示,在python中,...

shao
2012/08/22
0
0
Python 常用静态代码检查工具简介

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

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

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

数据分析v
08/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)

转发 TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions) 高级类型 可辨识联合(Discriminated Unions) 你可以合并单例类型,联合类型,类型保护和类型别名来创建一个叫做 ...

durban
13分钟前
1
0
画图工具

目标是不要让我自己摆放,那样会打断我的思路。要自己会摆放,我写字就好。 纠结对齐的我在也不会因为一个像素的问题小心翼翼的移动鼠标了。因为它对不齐你也管不了。 Graphviz https://www...

郭大鹏
13分钟前
1
0
在Visual Studio中使用GitHub(使用篇)

上一篇中已经介绍了如何在windows下安装和配置Git,并且详细说明了如何和GitHub连接。 这里就详细的说明下如何在Visual Studio中使用GitHub。这里也是一个简单的Git教程。 注:非常非常简单的...

Jokeny
13分钟前
1
0
tomcat 在liunx系统中shutdown后进程仍然存在解决办法

这个在windows下没有碰到过,因为此前跑Tomcat都是以服务而不是命令脚本的形式跑的,而且已经换了一个项目,所以暂时不考察windows下是否存在该问题。 难道是Tomcat版本问题?或者用带内存泄...

乱舞
15分钟前
1
0
区块链10年了,还未落地,它失败了吗?

几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 有人说,比特币是建...

linux-tao
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部