【原创】Python 源文件编码解读
======== 我是分割线 ========
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源文件编码的含义_【原创】Python 源文件编码解读
以下内容源于对 PEP-0263 的翻译和解读,同时给出了一些网上网友的说法. ======== 我是分割线 ======== PEP 0263 -- Defining Python Source ...
- python为源文件指定系统默认字符编码是_系统编码、文件编码与python系统编码
在linux中获取系统编码结果: Windows系统的编码,代码页936表示GBK编码 可以看到linux系统默认使用UTF-8编码,windows默认使用GBK编码.Linux环境下,文件默认使用U ...
- python字符编码是什么_python3字符编码是什么?怎么用?
最近一直讲的是python基础方面的知识,小编一直在考虑要不要加大难度.这个问题犹豫了很久,怕一些python小白不能很好的接受知识点.但是最近小编收到不少小伙伴的强烈要求,想要学习编码这个模块的知识 ...
- python的源代码文件的扩展名是-python源文件后缀是什么
python源文件后缀是py. 以 py 扩展名的文件是 Python 源码文件,由 python.exe 解释,可在控制台下运行.可用文本编辑器读写. Python中经常使用的文件后缀名: pyc ...
- python unicode编码书写方式_python 中文编码 小结 ,json读写,str转换unicode,文字比较...
最近用python做不少整理数据的工作,其中就包含不少关于中文处理的,所以总总结一下方便以后使用 1:json含汉字的utf编码读写 Python f2 = codecs.open('country_ ...
- python转载[编码问题]
转自: http://www.javaeye.com/topic/560229 一 预备知识 字符集1, 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言. 位数:ASCII是用7位 ...
- 1、代码中设置编码、编辑器中设置Python的编码
1Python中文编码 1.1代码中设置编码 Python中默认的编码格式是ASCII格式,在没有修改编码格式时无法正确打印汉字,所以在读取中文的时候会报错. 解决办法为只要在文件开头加入 # -- ...
- python字符编码
字符编码: ASCII:占一个字节,只支持英文 GBK2312:占两个字节,支持6700+汉字 GBK GB2312的升级版:支持21000+汉字 Unicode:2-4个字节 Unicode作用: ...
- 转载、Python的编码处理(二)
以下转自于:wklken的博客,写的非常好的一段有关编码的总结. Python-进阶-编码处理小结 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 ...
最新文章
- 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
- 基于Flink秒级计算时CPU监控图表数据中断问题
- Make sure the device specification refers to a valid device
- 再次推荐数据安全清除软件----Eraser
- [你必须知道的.NET]第二十七回:interface到底继承于object吗?
- Linux shell类型
- boost::gil::view_type用法的测试程序
- java 字符串缓冲池 String缓冲池
- mysql集群怎么实现状态机_分布式中的状态机
- python 速度 memmap_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例
- docker build 变量_Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
- Labview实现画板
- PPT参考线_Alt+F9
- 利用Matlab实现单像空间后方交会
- 网络原理——基础知识
- 产品经理必看电影:当幸福来敲门
- C#开发 虚拟翻书软件
- php wps导入数据库,wps excel表格怎么导入数据库-如何把excel表格导入wps
- 基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署
- python+minicap的使用 安卓手机投票到电脑
热门文章
- WPF学习总结1:INotifyPropertyChanged接口的作用
- 批处理编程的异类——时钟(Clock)
- 让UpdatePanel支持文件上传(2):服务器端组件
- [iOS]提交App报错ERROR ITMS -90207
- Android Studio项目引入外部库注意事项(PullToRefresh)
- XCode编译运行出错解决思路,以及再次推荐AppCode
- SerialPort实现对串口COM的操作(有些纠结)
- dataGridView右键菜单并选中该行 http://blog.csdn.net/lanmao100/archive/2009/06/25/4298529.aspx...
- svn is already locked解决方案
- 钻石问题(菱形继承问题) 和虚继承