【Python】python3编码方式encode介绍

上一篇文章介绍了计算机编码发展历史和编码方式,现在我们聚焦到python语言中,在最新的Python3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言。例如:

print('我喜欢 computer'.encode('utf-8'))

解释:print函数输出的这句话在python里是使用Unicode编码的(当然它此时也在内存中,因为它现在正被加载着...)

  • 打印结果:b'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2 computer'

看这个输出十分有趣,首先,输出是以b开头的,说明这是一段bytes。有没有想起上篇文章说过的utf-8是向下兼容ASCII码的?
你看输出中的英文computer就被原样输出,而ASCII码不能识别的中文,则用utf-8编码方式来表示,如\xe8,\x88等等。
那Unicode编码方式用得好好的,可以直接混合输出英文和中文等多种语言,换成utf-8输出字符只有英文能让我们看懂,中文变成了难以分辨的十六进制(\xe8\xbf\x99\xe5\x8f\xa5\xe8...),我们为什么还要有utf-8编码方式呢?
想到这个问题说明你已经get到点了。你想,utf-8编码方式的优点是什么?
就是省内存啊
那么,由于Python的字符串类型是str,在内存中以Unicode编码的,一个字符对应若干个字节。
如果要在网络上传输,或者保存到磁盘上,就需要把Unicode编码的str变为以字节为单位的bytes,而通过utf-8编码或者ASCII码编码生成的结果就是以字节为单位的bytes。
这句话这么长无非就重复一个观点:

  • python中的str是以Unicode编码的,如果要在网络上传输,或者保存到磁盘上,就得转换为utf-8编码方式。

再举个例子:

print('I love computer'.encode('ascii'))
  • 打印结果:b'I love computer'

解释:由于'I love computer'是纯英语,所以可以用ASCII编码。
再看:'I love computer'和'b'I love computer''有什么不同?没错,多了一个b。这个b大有玄妙之处:
'I love computer'是python中的str,是以Unicode方式编码的。
'b'I love computer''也是python中的str,但它是以ASCII码编码的。
同样用utf-8编码打印结果是一样的,(ASCII编码实际上可以被看成是UTF-8编码的一部分)
好了,前面是对纯英文的str进行编码,那对中文的str编码呢?可以对中文的str进行utf-8编码,可以进行ASCII码编码吗?

print('我喜欢 computer'.encode('ascii'))

报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

str_en = 'I love computer'
str_cn = '我喜欢 computer'
bytes_e = b'I love computer'
bytes_c = b'\xe6\x88\x91\xe5\x96\x9c\xe6\xac\xa2 computer'
#bytes_cm = b'我喜欢 computer'   # bytes can only contain ASCII literal characters.# bytes方法进行编码
def bytes_sample():bytes_en_by = bytes(str_en, encoding='utf_8')bytes_cn_by = bytes(str_cn, encoding='utf_8')print('纯英文字符串转换为bytes:',bytes_en_by)print('含中文字符串转换为bytes:',bytes_cn_by)# 编码
def encode_sample():bytes_en = str_en.encode('utf-8')bytes_cn = str_cn.encode('utf-8')bytes_en_as = str_en.encode('ascii')print('utf-8纯英文编码:',bytes_en)print('utf-8含中文编码:',bytes_cn)print('ascii纯英文编码:',bytes_en_as)#str_bytes= str.encode(str_cn)                   # 默认utf-8,等价于下面3个#str_bytes= str.encode(str_cn,'utf_8')#str_bytes= str.encode(str_cn,encoding='utf_8')str_bytes= str_cn.encode()print('str转成by含中文:',str_bytes)#bytes_cn_as = str_cn.encode('ascii')#print('ascii含中文编码,会报错:',bytes_cn_as)# 解码
def decode_sample():str_e = bytes_e.decode('utf-8')str_c = bytes_c.decode('utf-8')str_a = bytes_e.decode('ascii')print('utf-8纯英文解码:',str_e)print('utf-8含中文解码:',str_c)print('ascii纯英文解码:',str_a)if __name__ == '__main__':encode_sample()#decode_sample()#bytes_sample()

注意:b后面加上字符串,可以自动转换为bytes类型,但是只针对ASCII类型

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

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

相关文章

telnet用法 测试端口号是否可以使用

方法 1 首先打开控制面板 2 点击程序 3 点击程序与功能 4 点击左边启用或关闭windows功能 5 在telnet客户端打上勾 点击确定 6 winr打开运行 输入cmd 7 打开后输入telnet ip 端口号 如果出来其他窗口则说明这个端口可用。若出现超时,说明这个端口不可用 前提…

Python操作读写txt文件

比较常用的文件读写选项: r读写模式 w写读模式 a追加写模式 a追加读模式,因为文件值在最后,所以需要先seek(0)到文件开头,然后再读 ‘r’以读的方式打开,只能读文件,若文件不存…

【Python】PyCryptodome模块实现多种加密算法

PyCryptodome是python一个强大的加密算法库,可以实现常见的单向加密、对称加密、非对称加密、非对称加密算法签名和流加密算法。 直接pip安装即可:pip install pycryptodome 官网地址:https://pypi.org/project/pycryptodome/ 一、base64编码…

阿里云 Ubuntu上的mysql运行sql文件来创建表

1、上传sql文件到指定目录 2、登录数据库 mysql -u root -p 3、查看数据库 show databases; 4、创建数据库 create database wlh; 5、对新创建的数据库操作 use wlh; 6、导入sql文件 7、查看数据库中表格 若有你数据库中的表格则导入成功 8、退出数据库操作 或者用quit; …

linux Ubuntu安装ftp并将本地文件上传到云服务器

确认是否已经安装ftp pgrep vsftpd无结果如下图: 2、执行安装 3、查看ftp是否安装成功 systemctl status vsftpd.service 4、 (1)新建"/home/uftp"目录作为用户主目录 打开"终端窗口",输入"sudo mkd…

【Python】PyCryptodome模块中5种AES加密模式介绍

分组密码有五种工作体制: 1.电码本模式(Electronic Codebook Book (ECB)); 2.密码分组链接模式(Cipher Block Chaining (CBC)); 3.计算器模式(Counter (CTR))&#xff1b…

Pyhton随机生成测试数据模块faker

1.什么是Faker Faker是一个Python包,开源的GITHUB项目,主要用来创建伪数据,使用Faker包,无需再手动生成或者手写随机数来生成数据,只需要调用Faker提供的方法,即可完成数据的生成。 2.安装Faker pip insta…

linux常见操作命令

1、创建文件夹test : mkdir test 注:批量创建为mkdir -p file1/log 在此目录下创建file1/log 2、创建文件test touch test 3、删除文件test rm -f test 4、删除文件夹test(包括文件夹汇总的文件也会一起删除) rm -rf test 注:一般用…

营业执照、组织机构代码、统一社会信用代码

统一社会信用代码是营业执照注册号。这个是三证合一,一证一码的工商改革结果。 三证合一:是指营业执照,税务登记证,组织机构代码证合并为一张三证合一的营业执照。 一证一码:是将营业执照注册号,税号,组织机构代码证号合并为统一社会信用代码。 统一社会…

【探索篇】测试人员一直疏忽掉的测试用例点,你中枪了吗?

记得当初上测试课程时,老师就讲到头脑风暴,让我们尽情发挥:想象,讲的就是不局限思维、发散、开拓思维,可能发生的情况都可作为输入条件,实际我们运用到工作中,测试用例的设计是一样的道理,不能局…

阿里云root密码修改

一、root密码修改阿里云linux服务器修改root密码流程: 通过Xshell客户端输入账号root,输入密码,登陆到linux。 输入修改密码的命令 passwd 根据提示输入新密码,输入新密码的时候,软件不会显示*号,输入后…

【Android】Windows环境安装Android Studio教程

Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。 在IDEA的基础上,Android Studio提供: 基于Gradle的构建支持 Android…

数据库的显示、创建、使用 、用户授权管理及忘记root用户后重置密码

1、显示数据库 show databases; 默认的数据库及大致功能: mysql -- 用户权限 相关数据 test --用于用户测试数据 information_schema -MySQL 本身架构相关的数据 2、创建数据库 create database 数据库名称 default charset utf8 collate utf8_general_ci ; 3、…

【Android】Android Studio打包生成正式签名的APK

Android Studio是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA。它类似于Eclipse ADT,Android Studio 提供了集成的Android开发工具用于开发和调试。 那么今天我们就来讲讲如何通过Android Studio打包APK文件,相信有很多人还不是非常了…

Python实现单例

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 我们在使用class创建类的时候, 只…

mysql添加用户及权限

一、增加权限 mysql> grant 权限1,权限2,...权限n on 数据库名称.表名称 to 用户名用户地址 identified by 连接口令; mysql>flush privileges; (刷新系统权限表) 权限1,权限2,...权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,rel…

Python unittest中初始化固件setUp和销毁固件tearDown详解

unittest.TestCase 包含了 setUp() 和 tearDown() 两个方法,其中 setUp() 方法用于初始化测试固件;而 tearDown() 方法用于销毁测试固件。程序会在运行每个测试用例(以 test_ 开头的方法)之前自动执行 setUp() 方法来初始化测试固…

【Android】Android Studio中新创建的app目录结构

安装Android Studio后,然后创建一个app项目。对于初学者来说,我们希望了解app目录结构,然后更好的进行开发工作。 但是要想了解一个app的目录结构,首先需要明确两个概念 Project Name:工程项目名称 Application Name:当前app发布…

mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决

mysql添加用户及权限报错: 出现这样错的原因有两个: 1、语法有问题 (这里没有问题) 2、mysql版本是否支持 此种写法 找到一位大神说:你检查下mysql版本是mysql server 8.不支持同时创建用户和授予权限&#xf…

Python Pytest前置setup和后置teardown详解

pytest用例运行级别: ●模块级(setup_module/teardown_module)开始于模块始末,全局的 ●函数级(setup_function/teardown_function)只对函数用例生效 ●类级(setup_class/teardown_class&#x…