以下内容源于对 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 源文件编码解读相关推荐

  1. python源文件编码的含义_【原创】Python 源文件编码解读

    以下内容源于对 PEP-0263 的翻译和解读,同时给出了一些网上网友的说法. ========  我是分割线 ======== PEP 0263 -- Defining Python Source ...

  2. python为源文件指定系统默认字符编码是_系统编码、文件编码与python系统编码

    在linux中获取系统编码结果: Windows系统的编码,代码页936表示GBK编码 可以看到linux系统默认使用UTF-8编码,windows默认使用GBK编码.Linux环境下,文件默认使用U ...

  3. python字符编码是什么_python3字符编码是什么?怎么用?

    最近一直讲的是python基础方面的知识,小编一直在考虑要不要加大难度.这个问题犹豫了很久,怕一些python小白不能很好的接受知识点.但是最近小编收到不少小伙伴的强烈要求,想要学习编码这个模块的知识 ...

  4. python的源代码文件的扩展名是-python源文件后缀是什么

    python源文件后缀是py. 以 py 扩展名的文件是 Python 源码文件,由 python.exe 解释,可在控制台下运行.可用文本编辑器读写. Python中经常使用的文件后缀名: pyc ...

  5. python unicode编码书写方式_python 中文编码 小结 ,json读写,str转换unicode,文字比较...

    最近用python做不少整理数据的工作,其中就包含不少关于中文处理的,所以总总结一下方便以后使用 1:json含汉字的utf编码读写 Python f2 = codecs.open('country_ ...

  6. python转载[编码问题]

    转自: http://www.javaeye.com/topic/560229 一 预备知识 字符集1, 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言. 位数:ASCII是用7位 ...

  7. 1、代码中设置编码、编辑器中设置Python的编码

    1Python中文编码 1.1代码中设置编码 Python中默认的编码格式是ASCII格式,在没有修改编码格式时无法正确打印汉字,所以在读取中文的时候会报错. 解决办法为只要在文件开头加入 # -- ...

  8. python字符编码

    字符编码: ASCII:占一个字节,只支持英文 GBK2312:占两个字节,支持6700+汉字 GBK GB2312的升级版:支持21000+汉字 Unicode:2-4个字节 Unicode作用: ...

  9. 转载、Python的编码处理(二)

    以下转自于:wklken的博客,写的非常好的一段有关编码的总结. Python-进阶-编码处理小结 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 ...

最新文章

  1. 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
  2. 基于Flink秒级计算时CPU监控图表数据中断问题
  3. Make sure the device specification refers to a valid device
  4. 再次推荐数据安全清除软件----Eraser
  5. [你必须知道的.NET]第二十七回:interface到底继承于object吗?
  6. Linux shell类型
  7. boost::gil::view_type用法的测试程序
  8. java 字符串缓冲池 String缓冲池
  9. mysql集群怎么实现状态机_分布式中的状态机
  10. python 速度 memmap_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例
  11. docker build 变量_Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
  12. Labview实现画板
  13. PPT参考线_Alt+F9
  14. 利用Matlab实现单像空间后方交会
  15. 网络原理——基础知识
  16. 产品经理必看电影:当幸福来敲门
  17. C#开发 虚拟翻书软件
  18. php wps导入数据库,wps excel表格怎么导入数据库-如何把excel表格导入wps
  19. 基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署
  20. python+minicap的使用 安卓手机投票到电脑

热门文章

  1. WPF学习总结1:INotifyPropertyChanged接口的作用
  2. 批处理编程的异类——时钟(Clock)
  3. 让UpdatePanel支持文件上传(2):服务器端组件
  4. [iOS]提交App报错ERROR ITMS -90207
  5. Android Studio项目引入外部库注意事项(PullToRefresh)
  6. XCode编译运行出错解决思路,以及再次推荐AppCode
  7. SerialPort实现对串口COM的操作(有些纠结)
  8. dataGridView右键菜单并选中该行 http://blog.csdn.net/lanmao100/archive/2009/06/25/4298529.aspx...
  9. svn is already locked解决方案
  10. 钻石问题(菱形继承问题) 和虚继承