Python_关于python2的encode(编码)和decode(解码)的使用

news2024/11/26 7:39:50

目录

python执行过程的编解码

encode&decode

中文乱码解决方法

常见问题

格式化带有中文的字符串报错

带有中文的字符串反转后乱码


在使用Python2时,我们习惯于在文件开头声明编码

# coding: utf-8

不然在文件中出现中文,运行时就会报错 SyntaxError: Non-ASCII character... 之类,这是因为python2的文件编码默认使用的ascii,ascii码是不支持中文的。

如果在开头声明了编码,文件编码就会变为utf-8。

python执行过程的编解码

python使用的unicode类型作为编码的基础类型,默认情况下,python在执行文件过程中的编解码为 str-->unicode-->str,当我们在python开头声明utf-8编码后,编解码就变为了  str-->ascii-->str

举个简单例子,就可以验证这个现象。

# coding:utf-8
s = "我要学Python"
print(1, s)

 从打印结果可以看出,我们没有做任何处理,中文在执行过程就被处理成了ascii码

encode&decode

在了解了Python执行过程的编码转换后,那我们自己如果转换编码该如何实现呢?这里就得使用两个内置方法 encode编码和decode解码。

例如:

# coding:utf-8
s = "我要学Python"
s.encode("utf-8")   # 编码
s.decode("utf-8")   # 解码

上面是方法的简单运用,但是执行上面代码,第3行就会出现编解码过程中常见的一个报错

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

简单分析下,明明执行的encode方法,为什么会抛decode错误呢?这就要从上面介绍的python执行过程来分析了。

在执行encode方法编码时,python先要解码,而Python解码默认用unicode格式,而文件开头指定的编码格式为ascii,这就导致编码格式与解码格式不一致,从而产生了报错 ascii 不能解码成 unicode。

要解决这个问题,只需要在编码前,用utf-8格式解码就可以了

s = "我要学Python"
s.decode("utf-8").encode("utf-8")   # 编码
s.decode("utf-8")   # 解码

中文乱码解决方法

在了解编解码过程后,我们来解决实际遇到的问题:接口响应中文乱码!

比如:在接口测试中,有些响应类似 "\u9875\u9762\u4e0d\u5b58\u5728" 的响应内容,看起来就像乱码

注意看乱码前面有个u ,这表示使用的unicode编码字符。可用以下方法进行解码:

# 直接在 unicode 字符串前加u  ===> 使用Python机制自动解码
s = u"\u9875\u9762\u4e0d\u5b58\u5728"
print(s)   # 打印:页面不存在。因为字符串为unicode编码格式,python在执行过程中,默认就是使用的unicode解码,编解码类型一致,就看到了中文打印内容

# 使用 decode 方法解码成中文 ===> 主动解码
s = "\u9875\u9762\u4e0d\u5b58\u5728"
print(s.decode("unicode_escape"))

常见问题

格式化带有中文的字符串报错

格式拼接的字符串包含中文,会抛错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

# coding:utf-8

s = "\u9875\u9762\u4e0d\u5b58\u5728"

# 拼接的字符串 不包含 中文字符===>正常
print("result: %s" % s.decode("unicode_escape"))

# 拼接的字符串 包含 中文字符串===>异常
print("结果: %s" % s.decode("unicode_escape"))

问题分析:

解决方法:

统一编码格式

# coding:utf-8

s = "\u9875\u9762\u4e0d\u5b58\u5728"

# 方法1:将右边变为 ascii 编码
print("结果:%s" % s.decode("unicode_escape").encode("utf-8"))

# 方法2:将左边变为 unicode 编码
print(u"结果:%s" % s.decode("unicode_escape"))

带有中文的字符串反转后乱码

带有中文的字符串使用列表反转方式后乱码,使用decode("utf-8") 解码,报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 0: invalid start byte

# coding:utf-8

s = "qta_baseline_test_勿删"[::-1]
print(s)
print(s.decode("utf-8"))

 问题分析:

中文被Python解析后,先转换成ascii码

 当使用列表反转方式后,实际把ascii反转

 这就导致了反转后的乱码无法被decode("utf-8")正常解码

解决方法:

因为采用的utf-8编码,所以先使用utf-8解码,解码后再反转

# coding:utf-8

s = "qta_baseline_test_勿删"[::-1]
print(s)

s = "qta_baseline_test_勿删".decode("utf-8")[::-1]
print(s)
s = s.encode("utf-8")       # 为了后续字符串能正常使用,建议在按原编码方式编码
print(s)


-事必有法,然后有成- 最后祝大家早日达到测试的天花板!



 以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以评论区,留言【777】直接拿走就好了

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

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

相关文章

查看和指定GPU服务器显卡训练模型

查看和指定GPU服务器显卡 1.查看显卡2.间隔查看GPU使用情况3.查看当前显卡信息4. 使用os指定使用的显卡 1.查看显卡 nvidia-smiGPU:GPU 编号;与实际编号不一定一致 Name:GPU 型号; Persistence-M:持续模式的状态。持续…

【TEVC 2023】用于进化计算的知识学习 + 进化计算(Evolutionary computation (EC) )其中的一些概念

Knowledge Learning for Evolutionary Computation 进化计算(Evolutionary computation (EC) )是一种从自然进化和群体智能行为(swarm intelligence behaviors)中汲取灵感的元启发式算法。 目前,EC以其解决优化问题的…

《Redis 核心技术与实战》课程学习笔记(二)

数据结构:快速的 Redis 有哪些慢操作 数据库这么多,为啥 Redis 能有这么突出的表现呢? 一方面,因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。另一方面,因为&#xff…

SQL入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

导读: SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数据库或与其相关的产品来存储,而操纵数据库的语言正是 SQL &…

vue页面中一个小列表中多选框的选中状态的两种设置方法

第一种方法:所有类型都是固定的、后台提供了选中状态的接口(页面进入时默认展示所有类型和类型的选中状态 思路: 1、列出所有类型同时与后台规定好每种类型的id与对应的名称 2、在mounted中执行获取后台给定的选中状态(包含1个或多个的id数组) 3、将得到的结构绑定到el-ch…

单元测试基础

一、什么是单元测试: 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类;单元测试属于最严格的软件测试手段,是最接近代码底层实现…

剑指 Offer 14- II: 剪绳子 II

这道题不能使用动态规划来解决,因为会越界。用贪心算法找规律可以得到答案(3越多越好,小于等于4取本身的值) 这道题错的原因在于res在存储过程中会越界,最轻微的上溢是 INT_MAX 1 :结果是 INT_MIN。 最严重…

C++学习笔记-第10单元 模板初步

第10单元 模板初步 文章目录 第10单元 模板初步单元导读10.1 模板与泛型编程10.1.1 元编程与泛型编程10.1.2 初识模板 10.2 函数模板10.2.1 函数模板10.2.2 函数模版实例化 10.3 排序示例与泛型化10.3.1 例子:选择排序10.3.2 将一个函数泛型化 10.4 类模板10.4.1 类…

基于matlab使用深度学习从分割图生成图像(附源码)

一、前言 此示例演示如何使用 pix2pixHD 条件生成对抗网络 (CGAN) 从语义分割映射生成场景的合成图像。 Pix2pixHD [1] 由两个同时训练的网络组成,以最大限度地提高两者的性能。 生成器是一种编码器-解码器风格的神经网络,可从语…

设置云服务器和配置docker

一、设置云服务器 刚租完服务器,直接利用公网ip登录此时进入到的是root目录下 ssh root公网ip 但是root的权限太大,一般做项目不会在root路径下直接操作,会创建一个子用户,一台服务器可以创建多个子用户,就像一个大…

通用二进制方式安装Mysql

一、去官网下载MySQL glibc版本 示例环境为CentOS 7.9版本,要安装的Mysql版本为5.7 1.选择版本下载到自己本地 下载地址:https://dev.mysql.com/downloads/mysql/ 2.将下载的tar包上传到自己的CentOS虚拟主机上 传输完成后,查看确认一下 …

Tomcat相关

1. 运行项目 将java项目打包为war或者war所对应的文件夹,放置于tomcat的webapps目录下。其实tomcat运行时会解压war到项目中并运行class文件,延伸开来,为啥不能用jar包,因为jar可能可以表示项目但也能表示依赖,tomcat…

Linux 内核和驱动开发工程师的发展前景怎么样?

或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧。但是作为我来说,也许我更想把这个标题作为一个疑问句来使用,整理一下自己的认识,用来勉励自己,和大家一起努力实现这个目标。认识肤浅的地…

4.51ue4:savegame

1.创建savegame,蓝图搜索savegame创建 2.ue4是类似于计算机磁盘读取和内存响应的方式进行保存数据,又称序列化。 详解: 序列化时类似于:从内存保存数据到磁盘的过程,是将数据进行序列化存入磁盘。 读取数据就是反序…

社区说|浅谈 WorkManager 的设计与实现:系统概述

什么是 社区说 ? 反思 系列博客是一种看似 “内卷” ,但却 效果显著 的学习方式,该系列起源和目录请参考 这里 。 困境 作为一名 Android 开发者,即使你没有用过,也一定对 WorkManager 耳熟能详。 自2018年发布以来&#xff0c…

设计模式第22讲——访问者模式(Visitor)

目录 一、什么是访问者模式 二、角色组成 三、优缺点 四、 应用场景 4.1 生活场景 4.2 Java场景 五、代码实现 5.0 UML类图 5.1 抽象访问者——Visitor 5.2 具体访问者——Tourist 5.3 抽象元素——Spot 5.4 具体元素——View、Relic 5.5 对象结构——SpotCollecti…

大厂面试打起12万分小心?3轮技术面过,你也可能挂在HR手上!

很多朋友在面试大厂时存在一个误区,认为面试你的那个是最初给你打电话的HR,其实不然,更大可能是业务部门相关的 HRBP导致你面试失败。 1、什么是HRBP? 为了解释清楚这个问题,先说 HRBP 是什么。HRBP全称为 Human Resource Busin…

java对象clone

Object提供了colne方法给我们定义的类,用来进行对象克隆,但是这个clone方法是protected的,所以需要在我们需要使用clone的类中重写Object的clone方法,并且需要实现Cloneable接口,Cloneable接口是一个标记接口&#xff…

「JVS低代码开发平台2.1.8版本」-首页功能介绍

JVS是面向软件开发团队可以快速实现应用的基础开发脚手架,主要定位于企业信息化通用底座,采用微服务分布式框架,提供丰富的基础功能,集成众多业务引擎,它灵活性强,界面化配置对开发者友好,底层容…

【Java】Netty中ByteBuf学习笔记

文章目录 1) ByteBuf创建与自动扩容2)直接内存 vs 堆内存3)池化 vs 非池化4)组成5)写入6)扩容7)读取8)retain & release9)slice10)duplicate11)copy12&am…