python源文件编码的含义_【原创】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.

# coding=

2.

#!/usr/bin/python

# -*- coding: -*-

3.

#!/usr/bin/python

# vim: set fileencoding= :

在前两种方式中,实际上是通过 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

...

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

小实验截图:

输出中文。

A083830783-45495.png

报错。

A083832908-45496.png_small.png添加编码。

A083834970-45497.png

正常输出。

A083837033-45498.png

IDE默认的编码设置。

A083839127-45499.png_small.png

各种转码输出。

A083841252-45500.png_small.png

输出的结果。

A083843439-45501.png_small.png

A083845548-45502.png_small.png

补充说明:

cp936即 code page 936(代码页936)是以GBK(国标扩展字符集)为基础的编码。GB2312(国标字符集)只是GBK的一部分。

GB2312只支持常用的汉字,而且是简体字。GBK支持繁体字和生僻字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEclipse中SVN的常见的使用方法

本次主要内容: 一 、导入项目 (Checkout)。从svn资源库检出 二 、更新 (Update) 三、锁(对要修改的文件加锁,防止文件冲突) 四、提交(项目修改后的提交) 五、…

fastapi 路径依赖项Depends / 装饰器依赖dependencies / 全局依赖 / 带 yield 的依赖

文章目录1. 依赖项2. 类作为依赖3. 子依赖项3.1 多次使用同一个依赖项4. 路径操作装饰器依赖项5. 全局依赖项6. 带 yield 的依赖项7. 使用带 yield 上下文管理器作为依赖项learn from https://fastapi.tiangolo.com/zh/tutorial/dependencies/ 1. 依赖项 只能传给 Depends 一…

fastapi 安全性 / APIRouter / BackgroundTasks / 元数据 / 测试调试

文章目录1. 例子2. 获取当前用户3. 使用密码和 Bearer 的简单 OAuth24. 使用(哈希)密码和 JWT Bearer 令牌的 OAuth25. 多个应用文件5.1 APIRouter6. BackgroundTasks7. 元数据7.1 标题、描述和版本7.2 openapi_tags 标签元数据7.3 OpenAPI URL7.4 文档 …

java json path_Java使用JSONPath解析JSON完整内容详解

JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的js…

LeetCode 2050. 并行课程 III(拓扑排序)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n ,表示有 n 节课,课程编号从 1 到 n 。 同时给你一个二维整数数组 relations ,其中 relations[j] [prevCoursej, nextCoursej] ,表示课程 prevCoursej 必须在课程 nextCoursej 之前…

LeetCode 1521. 找到最接近目标值的函数值(位运算)

文章目录1. 题目2. 解题1. 题目 Winston 构造了一个如上所示的函数 func 。他有一个整数数组 arr 和一个整数 target ,他想找到让 |func(arr, l, r) - target| 最小的 l 和 r 。 请你返回 |func(arr, l, r) - target| 的最小值。 请注意, func 的输入参…

LeetCode 2053. 数组中第 K 个独一无二的字符串(哈希)

文章目录1. 题目2. 解题1. 题目 独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串。 给你一个字符串数组 arr 和一个整数 k ,请你返回 arr 中第 k 个 独一无二的字符串 。 如果 少于 k 个独一无二的字符串,那么返回 空字符串 “” 。 注意…

LeetCode 2055. 蜡烛之间的盘子(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个长桌子,桌子上盘子和蜡烛排成一列。 给你一个下标从 0 开始的字符串 s ,它只包含字符 * 和 | ,其中 * 表示一个 盘子 ,| 表示一支 蜡烛 。 同时给你一个下标从 0 开始的二维整数数组 que…

策略模式java 用例_java策略模式简单用例

运用java策略模式一个小程序/****/package Strategy;import java.util.Arrays;/*** author HuangRong* Funtion 定义策略*/public interface ComputablesStra {public abstract void printForm();}/****/package Strategy;/*** author HuangRong* Function 为策略模式中的上下文…

LeetCode 2057. 值相等的最小索引

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums ,返回 nums 中满足 i mod 10 nums[i] 的最小下标 i ;如果不存在这样的下标,返回 -1 。 x mod y 表示 x 除以 y 的 余数 。 示例 1: 输入:num…

LeetCode 2058. 找出临界点之间的最小和最大距离(链表)

文章目录1. 题目2. 解题1. 题目 链表中的 临界点 定义为一个 局部极大值点 或 局部极小值点 。 如果当前节点的值 严格大于 前一个节点和后一个节点,那么这个节点就是一个 局部极大值点 。 如果当前节点的值 严格小于 前一个节点和后一个节点,那么这个…

LeetCode 2059. 转化数字的最小运算数(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums ,该数组由 互不相同 的数字组成。另给你两个整数 start 和 goal 。 整数 x 的值最开始设为 start ,你打算执行一些运算使 x 转化为 goal 。你可以对数字 x 重复执行下述运算&…

又是一年国庆假期最后一天

时间过的真的很快啊,美好的日子已经快过完了,在长假的最后一天,有很多的朋友可能都会抱怨,不想上班了,好想在好好的玩玩。开开心心的过完了假期的前六天,当突然被告知明天就是最后一天,你会有什…

LeetCode 2062. 统计字符串中的元音子字符串

文章目录1. 题目2. 解题1. 题目 子字符串 是字符串中的一个连续(非空)的字符序列。 元音子字符串 是 仅 由元音(a、e、i、o 和 u)组成的一个子字符串,且必须包含 全部五种 元音。 给你一个字符串 word ,…

1006实验一实验报告

实验一报告 实验一、DOS命令解释程序的编写 13物联网工程 张学玲 201306104140 一、 实验目的 (1)认识DOS; (2)掌握命令解释程序的原理; (3)掌握简单的DOS调用方法; &a…

LeetCode 2063. 所有子字符串中的元音(数学)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 word ,返回 word 的所有子字符串中 元音的总数 ,元音是指 a、e、i、o 和 u 。 子字符串 是字符串中一个连续(非空)的字符序列。 注意:由于对 word 长度的限制比较宽松…

LeetCode 2064. 分配给商店的最多商品的最小值(二分查找)

文章目录1. 题目2. 解题1. 题目 给你一个整数 n ,表示有 n 间零售商店。 总共有 m 种产品,每种产品的数目用一个下标从 0 开始的整数数组 quantities 表示,其中 quantities[i] 表示第 i 种商品的数目。 你需要将 所有商品 分配到零售商店&a…

LeetCode 2065. 最大化一张图中的路径价值(DFS)

文章目录1. 题目2. 解题1. 题目 给你一张 无向 图,图中有 n 个节点,节点编号从 0 到 n - 1 (都包括)。 同时给你一个下标从 0 开始的整数数组 values ,其中 values[i] 是第 i 个节点的 价值 。同时给你一个下标从 0 开…

LeetCode 1739. 放置盒子(数学)

文章目录1. 题目2. 解题1. 题目 有一个立方体房间,其长度、宽度和高度都等于 n 个单位。 请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。放置规则如下: 你可以把盒子放在地板上的任何地方。如果盒子 x 需要放置在盒子 y 的…

LeetCode 2068. 检查两个字符串是否几乎相等

文章目录1. 题目2. 解题1. 题目 如果两个字符串 word1 和 word2 中从 ‘a’ 到 ‘z’ 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。 给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎…