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

简介:
以下内容源于对 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.  
?
1
# coding=<encoding name>
2.  
?
1
2
#!/usr/bin/python
# -*- coding: <encoding name> -*-
3.  
?
1
2
#!/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 风格的文件编码注释  
?
1
2
3
4
#!/usr/bin/python
# -*- coding: latin-1 -*-
import os, sys
...
?
1
2
3
4
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import os, sys
...
?
1
2
3
4
#!/usr/bin/python
# -*- coding: ascii -*-
import os, sys
...

2. 无 Python 解析器说明 + 普通明文描述  
?
1
2
3
# This Python file uses the following encoding: utf-8
import os, sys
...

3. Python 解析器说明 + 非 Emacs 风格的文件编码注释  
?
1
2
3
4
#!/usr/local/bin/python
# coding: latin-1
import os, sys
...

4. 无编码注释(Python 解析器默认为 ASCII)  
?
1
2
3
#!/usr/local/bin/python
import os, sys
...

5. 错误的编码注释方式  
a. 无 coding: 前缀  
?
1
2
3
4
#!/usr/local/bin/python
# latin-1
import os, sys
...
b. 编码注释不在第一或第二行  
?
1
2
3
4
5
#!/usr/local/bin/python
#
# -*- coding: latin-1 -*-
import os, sys
...
c. 使用不支持的编码  
?
1
2
3
4
#!/usr/local/bin/python
# -*- coding: utf-42 -*-
import os, sys
...

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

小实验截图:
输出中文。
 
 
报错。 
添加编码。 
 
正常输出。 
 
IDE默认的编码设置。 
 
各种转码输出。 
 
输出的结果。 
 

 

补充说明:  
cp936即 code page 936(代码页936)是以GBK(国标扩展字符集)为基础的编码。GB2312(国标字符集)只是GBK的一部分。   GB2312只支持常用的汉字,而且是简体字。GBK支持繁体字和生僻字。  
目录
相关文章
|
Python
python第三方库-字符串编码工具 chardet 的使用(python3经典编程案例)
这篇文章介绍了如何使用Python的第三方库chardet来检测字符串的编码类型,包括ASCII、GBK、UTF-8和日文编码的检测示例。
1116 6
|
Python
Python 中如何指定 open 编码为ANSI
Python 中如何指定 open 编码为ANSI
418 1
|
Python
11个提升Python列表编码效率的高级技巧
Python中关于列表的一些很酷的技巧
263 1
|
数据采集 开发工具 Python
海康威视工业相机SDK+Python+PyQt开发数据采集系统(支持软件触发、编码器触发)
该系统基于海康威视工业相机SDK,使用Python与PyQt开发,支持Gige与USB相机设备的搜索及双相机同时显示。系统提供软件触发与编码器触发模式,并可在数据采集过程中实时保存图像。此外,用户可以调节曝光时间和增益,并进行信息输入,这些信息将被保存至配置文件以便下次自动加载。参数调节与实时预览等功能进一步增强了系统的实用性。
2098 1
|
开发者 Python
Python编码风格
Python编码风格
174 1
|
存储 自然语言处理 编译器
Python 源文件编译之后会得到什么,它的结构是怎样的?和字节码又有什么联系?
Python 源文件编译之后会得到什么,它的结构是怎样的?和字节码又有什么联系?
393 0
|
存储 缓存 Python
python中小数据池和编码
python中小数据池和编码
253 3
|
自然语言处理 Python
Python编码问题
Python编码问题是指在处理文本时,由于编码不一致导致程序不能正确处理文本的问题。在Python中,编码问题主要有两种情况:文件编码问题和字符串编码问题。
309 7
|
缓存 Java Unix
python中内存管理等10个编码习惯
【7月更文挑战第3天】本文涵盖了Python编程中的变量管理、模块导入、命令行参数、内存管理和面向对象设计的10个关键概念。
257 0
python中内存管理等10个编码习惯
|
JSON 数据库 开发者
FastAPI入门指南:Python开发者必看——从零基础到精通,掌握FastAPI的全栈式Web开发流程,解锁高效编码的秘密!
【8月更文挑战第31天】在当今的Web开发领域,FastAPI迅速成为开发者的热门选择。本指南带领Python开发者快速入门FastAPI,涵盖环境搭建、基础代码、路径参数、请求体处理、数据库操作及异常处理等内容,帮助你轻松掌握这一高效Web框架。通过实践操作,你将学会构建高性能的Web应用,并为后续复杂项目打下坚实基础。
994 0

推荐镜像

更多