程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

python封装使用语法规则

hfteth 2025-01-05 15:42:50 技术文章 9 ℃

字符编码:

编码,编成01;解码:把01转换成人能识别的字符;乱码:没意义的字符;

方案:

关键点: 编码和解码一致;
字符集(key-value):key是指01,value是指字符;
python字符编码原理:解释器在内存中把字符都转为unicode;因为其兼容所有的字符集,可以当做其它字符转换的中转站;

具体流程:
第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器

第二阶段:python解释器相当于文本编辑器,去打开test.py文件,从硬盘上将test.py的文件内容读入到内存中;pyhon的解释性,决定了解释器只关心文件内容,不关心文件后缀名;

第三阶段:python解释器解释执行刚刚加载到内存中test.py的代码( ps:在该阶段,即真正执行代码时,才会识别python的语法,执行文件内代码,当执行到name="egon"时,会开辟内存空间存放字符串"egon")


以下两个场景下涉及到字符编码的问题:

1、一个python文件中的内容是由一堆字符组成的,存取均涉及到字符编码问题(python文件并未执行,前两个阶段均属于该范畴)

此时,python解释器会读取test.py的第一行内容,#coding:utf-8,来决定以什么编码格式来读入内存,这一行就是来设定python解释器这个软件的编码使用的编码格式这个编码,可以用sys.getdefaultencoding()查看,如果不在python文件指定头信息#-*-coding:utf-8-*-,那就使用默认的,python2中默认使用ascii,python3中默认使用utf-8;


2、python中的数据类型字符串是由一串字符组成的(python文件执行时,即第三个阶段)

在程序执行之前,内存中确实都是unicode,比如从文件中读取了一行x="egon",其中的x,等号,引号,地位都一样,都是普通字符而已,都是以unicode的格式存放于内存中的;但是程序在执行过程中,会申请内存(与程序代码所存在的内存是俩个空间)用来存放python的数据类型的值,而python的字符串类型又涉及到了字符的概念比如x="egon",会被python解释器识别为字符串,会申请内存空间来存放字符串类型的值,至于该字符串类型的值被识别成何种编码存放,这就与python解释器的有关了,而python2与python3的字符串类型又有所不同。


在python中文件存储的编码格式,需要和解释器的编码格式保持一致,否则无法正常工作;从硬盘到内存的解码工作;
在py3中encode还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string;
python2中的str类型就是python3的bytes类型;
py2:只要是ascii编码范围内的字符对象,和unicode字符串运算时默认从bytes存储 转到 unicode存储;
汉字等不在ascii编码的字符对象存储时被py2转换成bytes存储;
print '苑昊' # 苑昊

print repr('苑昊') #'\xe8\x8b\x91\xe6\x98\x8a'

print (u"hello"+"yuan")

#print (u'苑昊'+'最帅') #UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6

# in position 0: ordinal not in range(128)

py3:文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes;
import json

s='苑昊'

print(type(s)) #<class 'str'>

print(json.dumps(s)) # "\u82d1\u660a"


b=s.encode('utf8')

print(type(b)) # <class 'bytes'>

print(b) # b'\xe8\x8b\x91\xe6\x98\x8a'


u=b.decode('utf8')

print(type(u)) #<class 'str'>

print(u) #苑昊

print(json.dumps(u)) #"\u82d1\u660a"

print(len('苑昊')) #

Tags:

最近发表
标签列表