当前位置: 首页 > news >正文

python | 字符串编码问题怎么破

python字符串常见两种类型:str和 bytes类型
str表示Unicode字符,bytes表示二进制数据
两者之间转换使用:encode()和decode()方法

一、enocde()和decode()方法

(一)encode()方法

encode()—编码,语法:

str.encode([encoding="utf-8"][,errors="strict"])
参数释义
str表示要进行转换的字符串
encoding = “utf-8”可选参数,指定进行编码时采用的字符编码类型,常用有utf-8、gb2312。默认值为utf-8,当只使用encoding参数时,可写成:str.encode(‘utf-8’)
errors = “strict”指定错误处理方式—strict:遇到非法字符抛出异常,ignore:忽略非法字符,replace:用“?”替换非法字符,xmlcharrefreplace:使用 xml 的字符引用。默认值为strict

(二)decode()方法

decode()—解码,语法:

bytes.decode([encoding="utf-8"[,errors="strict"])
参数释义
bytes表示要进行转换的二进制数据
encoding=“utf-8”指定解码时采用的字符编码,默认采用utf-8格式,当只使用encoding参数时,可写成:bytes.decode(‘utf-8’)
errors = “strict”同encode的errors参数一样

注: python3.x默认采用utf-8编码格式,较好解决了中文乱码问题。

二、常见转化使用场景

(一)将str类型字符串进行编码

a_str = '当时只道是寻常'
a_stru = a_str.encode('utf-8')
a_struc = a_str.encode('unicode-escape')
print('str转换为bytes(utf-8):\n', a_stru)
print('str转换为bytes(unicode):\n', a_struc)

在这里插入图片描述

(二)将二进制(bytes)字符串解码为str类型字符串

在进行解码之前,要先确定目标字符串是什么类型的数据格式
因为不是所有以\x、\u开头的字符串都是bytes类型
python3中字符串默认都为unicode(str类型),只有加上前缀b的字符串,才是bytes类型

b_str = '\xe5\xbd\x93'
b_str1 = b'\xe5\xbd\x93'
print('b_str数据类型:', type(b_str))
print('b_str1数据类型:', type(b_str1))

在这里插入图片描述
python常见字符串前缀含义

字符释义
uu’当时只道是寻常’,前缀u表示该字符串是unicode(str类型)。python2中,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码。python3中,所有字符串默认都是unicode(str类型),可以不用。
rr’当时只道是寻常\n\n’,前缀r表示该字符串是原始字符串,即\不是转义符,只是单纯的一个符号,常用于文件路径。
bb’赌书消得泼茶香,当时只道是寻常。',表示该字符串类型为bytes,用于python3中,python3字符串默认都是unicode(str类型)。python2的字符串本身就是bytes类型,可以不用。

确定目标字符串的类型后,就可以根据需求解码字符串。
常见有以下几种用法

1、用例1

decode()方法的常规操作,就是把bytes类型字符串进行解码

b_str = b'\xe5\xbd\x93\xe6\x97\xb6\xe5\x8f\xaa\xe9\x81\x93\xe6\x98\xaf\xe5\xaf\xbb\xe5\xb8\xb8'
b_str1 = b'\\u5f53\\u65f6\\u53ea\\u9053\\u662f\\u5bfb\\u5e38'
print('b_str解码:', b_str.decode('utf-8'))
print('b_str1解码:', b_str1.decode('unicode_escape'))

在这里插入图片描述

2、用例2

有时,需要把一些以\x、\u开头的str类型字符串进行解码。常见于网络爬虫程序文本抓取后。
当直接使用decode()方法对str类型字符串进行解码,将会报错,如下:

str1 = '\xe5\xbd\x93'
print(str1.decode('utf-8'))

在这里插入图片描述
解决办法: 先将str类型字符串编码成bytes类型,再进行解码。

str1 = '\xe5\xbd\x93\xe6\x97\xb6\xe5\x8f\xaa\xe9\x81\x93\xe6\x98\xaf\xe5\xaf\xbb\xe5\xb8\xb8'
str2 = '\\u5f53\\u65f6\\u53ea\\u9053\\u662f\\u5bfb\\u5e38'
str1j = str1.encode('iso-8859-1').decode()
str2j = str2.encode().decode('unicode_escape')
print('str1解码:', str1j)
print('str2解码:', str2j)

在这里插入图片描述

以上就是字符串编码问题解决办法。

-end-

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在Ubuntu 14.04上安装LAMP【快速入门】
  • Spring Boot发送邮件带附件功能怎么实现?
  • Vim多文件操作
  • 我叫:堆排序【JAVA】
  • 动手学深度学习7.6 残差网络(ResNet)-笔记练习(PyTorch)
  • 【MySQL】数据库约束和多表查询
  • 数学基础 -- 函数的平均值定理与定积分的中值定理
  • Redis合集 第二章 redis客户端 第一节 jedis
  • 点燃体育赛场新火花,IM与AI共启赛场新范式!
  • BGP实验
  • 基于linux下的mplayer播放器项目
  • 使用webpack搭建个本地项目
  • 版本更新 《坚持学习计时器》软件V3.2更新内容:增加删除指定数据的功能
  • Servlet的三种写法
  • tokenizer一些理解
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 230. Kth Smallest Element in a BST
  • 78. Subsets
  • Cumulo 的 ClojureScript 模块已经成型
  • gops —— Go 程序诊断分析工具
  • JS 面试题总结
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP 7 修改了什么呢 -- 2
  • REST架构的思考
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Zepto.js源码学习之二
  • 仿天猫超市收藏抛物线动画工具库
  • 如何合理的规划jvm性能调优
  • 鱼骨图 - 如何绘制?
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • ( 10 )MySQL中的外键
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (五)关系数据库标准语言SQL
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .md即markdown文件的基本常用编写语法
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET技术成长路线架构图
  • .net快速开发框架源码分享
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @RestControllerAdvice异常统一处理类失效原因
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解