文档章节

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

摩云飞
 摩云飞
发布于 2013/09/26 22:33
字数 780
阅读 1406
收藏 42
点赞 0
评论 1


以下内容源于对 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
码字总数 952690
作品 0
徐汇
程序员
加载中

评论(1)

伊藤熊吉
伊藤熊吉
目测pycharm
学习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 字符串与unicode对象 关于与区别 encode、decode

作者:shede333 主页:http://my.oschina.net/shede333 && http://blog.sina.com.cn/u/1509658847 版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 [Creative Commons BY-N...

shede333
2014/04/07
0
1
python(一)变量,常量,编码,数据类型

首先,对于python开发环境,个人推荐使用eclipse+pydev,这样是极好的 O(∩_∩)O python同php一样都属于弱数据类型语言,因此在定义变量的时候,python同样不需要给出数据的类型,然后它比p...

Koma
2015/01/14
0
0
The Interpreter and ... 之 Source Code Encoding

在python的源代码文件中,允许使用不同的字符集编码而并非只是ASCII。最好的设置方法是在“#!”之后再多设置一个特殊的行,用来定义源代码文件的编码,就像下面这样: 通过上诉方式的定义,所...

Koma
2015/03/03
0
1
python 文本编码识别 file magic有时候不准

试了用magic模块,但是有的文件里面是中文的(notepad++打开显示为unix ansi ,notepad++能正常打开显示),却被magic判断为"ISO 8859-1"。而用python chardet模块识别后,该文本内容编码为“...

kjpioo
2013/07/27
0
0
3 个 Python 模板库比较

你的下一个 Python 项目需要一个模板引擎来自动生成 HTML 吗?这有几种选择。 在我的日常工作中,我花费大量的时间将各种来源的数据转化为可读的信息。虽然很多时候这只是电子表格或某种类型...

20%
06/05
0
0
python经常出现的字符编码问题详解

python在进行字符串处理或者通过open函数读取文件时,经常会出现编码的错误:UnicodeDecodeE-rror: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)这个是由...

hffzkl
06/26
0
0
Python开发(基础):初识Python

Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quo...

wbb827
07/03
0
0
Python 字符编码转换要点

Python 字符编码转换要点 python 有str object 和 unicode object 两种字符串, 都可以存放字符的字节编码,但是他们是不同的type,这一点很重要,也是为什么会有encode 和decode。 encode 和...

木雨山
2012/09/13
0
0
关于Python报错:SyntaxError: Non-ASCII character '\xe5' in file的解决方法

现象:最近需要抓取一些网页的信息,但发现Python的乱码问题相对Java来说,不太一样。按照以往Java解决中文乱码问题的思路去解决Python乱码,貌似行不通,报错信息: SyntaxError: Non-ASCII...

xyxo
2013/07/05
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部