python程序有哪些编码规范

python程序有哪些编码规范,第1张

编码格式声明

通常,编码格式声明是必需的。如果 python 源码文件没有声明编码格式,python 解释器会默认使用 ASCII 编码,一旦源码文件包含非ASCII编码的字符,python 解释器就会报错。以 UTF-8 为例,以下两种编码格式声明都是合乎规则的。

缩进

统一使用 4 个空格进行缩进。绝对不要用tab, 也不要tab和空格混用。对于行连接的情况,我一般使用4空格的悬挂式缩进。例如:

引号

自然语言使用双引号

机器标识使用单引号

正则表达式使用双引号

空行

编码格式声明、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行

顶级定义之间空两行,方法定义之间空一行

在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行

导入模块

导入总应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前。导入应该按照从最通用到最不通用的顺序分组,分组之间空一行

标准库导入

第三方库导入

应用程序指定导入

命名规范

模块尽量使用小写命名,首字母保持小写,尽量不要用下划线

类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头

函数名一律小写,如有多个单词,用下划线隔开

私有函数可用一个下划线开头

变量名尽量小写, 如有多个单词,用下划线隔开

常量采用全大写,如有多个单词,使用下划线隔开

ASN1的文章本来是免费的,但是有的人一定要搞小动作,咱惹不起就只能躲着了,做了一些修改后,改为付费文章

应用程序在网络协议的应用层对payload数据,多使用ASN1标准进行处理

ASN1

ASN1

Abstract Syntax Notation One,抽象语法标记,ASN1是描述数据格式的标准方法, 它不管语言是如何执行、这些数据具体指什么、用什么类型的编码规则 ,是一种抽象的语法

ASN1由两部分组成:

一部分描述信息内数据,数据类型及序列格式

另一部分描述如何将各部分组成消息

语法

例如

Report ::= SEQUENCE {

author OCTET STRING,

title OCTET STRING,

body OCTET STRING,

biblio Bibliography

Report是结构体名称

SEQUENCE表示消息是由许多数据单元构成的

中括号{}里面是各种类型的数据单元

前三个数据单元author/title/body的类型是OCTET STRING

最后一个数据单元biblio的类型是另一个ASN1结构体

Bibliography ::= SEQUENCE {

author OCTET STRING

title OCTET STRING

publisher OCTET STRING

year OCTET STRING

数据类型

类型含义

NULL空

BOOLEAN布尔类型

INTEGER整型

REAL实数类型

BIT STRING比特串

OCTEC STRING字节

OBJECT IDENTIFIER实体标识符

ENUMERATED枚举类型

SEQUENCE序列

SEQUENCE OF类型的序列

SET集合

SET OF类型的集合

CHOICECHOICE类型

STRING(有很多就不一一列举)字符串类型

UTCTime时间类型

GeneralizedTime时间类型

ASN1文件结构

例如

Foo DEFINITIONS ::= BEGIN

    Question ::= SEQUENCE {

        id        INTEGER,

        question  IA5String

    }

    Answer ::= SEQUENCE {

        id        INTEGER,

        answer    BOOLEAN

    }

END 

解析上面的ASN1文件的结构

ASN1支持的编码规则

基本编码规则(BER)

规范编码规则(CER)

识别名编码规则(DER)

压缩编码规则(PER)

XML编码规则(XER)

python如何对ASN1结构的信息编码和解码

如果我们想用python对信息进行编码,需要明确几点:

提供的ASN1格式的数据

更多内容,请参考公-中-号, 汽车网络诊断通信

Python3中的编码问题前,第一个段落对字节、ASCII与Unicode与UTF-8等进行基本介绍,如果不对这几种编码犯头晕,可直接跳过。

ASCII与Unicode与UTF-8与GBK

首先从老大哥说起。跟很多人一样,大学读了这么久,久仰ASCII编码的大名。要说这个老大哥,我们再先从字节说起。一个字节包括八个比特位,每个比特位表示0或1,一个字节即可表示从00000000到11111111共2^8=256个数字。一个ASCII编码使用一个字节(除去字节的最高位作为作奇偶校验位),ASCII编码实际使用一个字节中的7个比特位来表示字符,共可表示2^7=128个字符。比如那时写C语言的程序,就经常要背下ASCII编码中的01000001(即十进制的65)表示字符‘A’,01000001加上32之后的01100001(即十进制的97)表示字符‘a’。现在打开Python,调用chr和ord函数,我们可以看到Python为我们对ASCII编码进行了转换。

第一个00000000表示空字符,因此ASCII编码实际上只包括了

字母、标点符号、特殊符号等共127个字符。因为ASCII是在美国出生的,对于由字母组成单词进而用单词表达的英文来说也是够了。但是中国人、日本人、

韩国人等其他语言的人不服了。中文是一个字一个字,ASCII编码用上了浑身解数256个字符都不够用。

因此后来出现了Unicode编码。Unicode编码通常由两个字节组成,共表示256256个字符,即所谓的UCS-2。某些偏僻字还会用到四个字节,即所谓的UCS-4。也就是说Unicode标准也还在发展。但UCS-4出现的比较少,我们先记住:最原始的ASCII编码使用一个字节编码,但由于语言差异字符众多,人们用上了两个字节,出现了统一的、囊括多国语言的Unicode编码。

在Unicode中,原本ASCII中的127个字符只需在前面补一个全零的字节即可,比如前文谈到的字符‘a’:01100001,在Unicode中变成了00000000 01100001。不久,美国人不开心了,吃上了世界民族之林的大锅饭,原本只需一个字节就能传输的英文现在变成两个字节,非常浪费存储空间和传输速度。

人们再发挥聪明才智,于是出现了UTF-8编码。因为针对的是空间浪费问题,因此这种UTF-8编码是可变长短的,从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节。解决了空间问题,UTF-8编码还有一个神奇的附加功能,那就是兼容了老大哥的ASCII编码。一些老古董软件现在在UTF-8编码中可以继续工作。

注意除了英文字母相同,汉字在Unicode编码和UTF-8编码中通常是不同的。比如汉字的‘中’字在Unicode中是01001110

00101101,而在UTF-8编码中是11100100 10111000

10101101。

我们祖国母亲自然也有自己的一套标准。那就是GB2312和GBK。当然现在挺少看到。通常都是直接使用UTF-8。记得我唯一一次看到GB编码的网页,是一个成人网站。

Python3中的默认编码

Python3中默认是UTF-8,我们通过以下代码:

import sys

sysgetdefaultencoding()

可查看Python3的默认编码。

Python3中的encode和decode

Python3中字符编码经常会使用到decode和encode函数。特别是在抓取网页中,这两个函数用的熟练非常有好处。我的理解,encode的作用,使我们看到的直观的字符转换成计算机内的字节形式。decode刚好相反,把字节形式的字符转换成我们看的懂的、直观的、“人模人样”的形式。如下图。

\x表示后面是十六进制,\xe4\xb8\xad即是二进制的11100100 10111000

10101101。也就是说汉字‘中’encode成字节形式,是11100100 10111000

10101101。同理,我们拿11100100

10111000 10101101也就是\xe4\xb8\xad来decode回来,就是汉字‘中’。完整的应该是b'\xe4\xb8\xad',在Python3中,以字节形式表示的字符串则必须加上前缀b,也就是写成上文的b'xxxx'形式。

前文说的Python3的默认编码是UTF-8,所以我们可以看到,Python处理这些字符的时候是以UTF-8来处理的。因此从上图可以看到,就算我们通过encode('utf-8')特意把字符encode为UTF-8编码,出来的结果还是相同:b'\xe4\xb8\xad'。

明白了这一点,同时我们知道UTF-8兼容ASCII,我们可以猜想大学时经常背诵的‘A’对应ASCII中的65,在这里是不是也能正确的decode出来呢。十进制的65转换成十六进制是41,我们尝试下:

b'\x41'decode()

结果如下。果然是字符‘A’

Python3中的编码转换

据说字符在计算机的内存中统一是以Unicode编码的。只有在字符要被写进文件、存进硬盘或者从服务器发送至客户端(例如网页前端的代码)时会变成utf-8。但其实我比较关心怎么把这些字符以Unicode的字节形式表现出来,露出它在内存中的庐山正面目的。这里有个照妖镜:

xxxxencode/decode('unicode-escape')

输出如下

b'\\u4e2d'还是b'\u4e2d,一个斜杠貌似没影响。同时可以发现在shell窗口中,直接输'\u4e2d'和输入b'\u4e2d'decode('unicode-escape')是相同的,都会打印出汉字‘中’,反而是'\u4e2d'decode('unicode-escape')会报错。说明说明Python3不仅支持Unicode,而且一个‘\uxxxx’格式的Unicode字符可被辨识且被等价于str类型。

如果我们知道一个Unicode字节码,怎么变成UTF-8的字节码呢。懂了以上这些,现在我们就有思路了,先decode,再encode。代码如下:

xxxdecode('unicode-escape')encode()

测试如下:

可以看到最后输出的UTF-8字节与上面的相同。尝试成功。所以其他的编码之间的转换,大概也是如此。

最后的扩展

还记得刚刚那个ord吗。时代变迁,老大哥ASCII被人合并,但ord还是有用武之地。试试ord('中'),输出结果是20013。20013是什么呢,我们再试试hex(ord('中')),输出结果是'0x4e2d',也就是20013是我们在上文见面了无数次的x4e2d的十进制值。这里说下hex,是用来转换成十六进制的函数,学过单片机的人对hex肯定不会陌生。

最后的扩展,在网上看到的他人的问题。我们写下类似于'\u4e2d'的字符,Python3知道我们想表达什么。但是让Python读取某个文件的时候出现了'\u4e2d',是不是计算机就不认识它了呢?后来下文有人给出了答案。如下:

import codecs

file = codecsopen( "atxt", "r", "unicode-escape" )

u = fileread()

print(u)

1、python2与python3稍微有点区别

2、python2中默认的字符编码格式都是unicode,在字符串前加'u',表示unicode 编码

3、将unicode转换成中文,只需要用deconde解码就可以了

>>> u='欢迎'

>>> e=uencode()

>>> e

b'\xe6\xac\xa2\xe8\xbf\x8e'

>>> edecode()#python3中默认就是utf-8编码

'欢迎'

>>> edecode('gbk')#如果解码为gbk就是乱码

'娆四繋'

python2编码环境比较复杂,在这里不做详细说明

以上就是关于python程序有哪些编码规范全部的内容,包括:python程序有哪些编码规范、ASN.1语法以及在python中如何编码解码、python3.4 编码有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9490257.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存