0

0

Python怎么把字节(bytes)转换为字符串_Python字节与字符串的编解码转换

尼克

尼克

发布时间:2025-09-12 19:42:01

|

1060人浏览过

|

来源于php中文网

原创

字节与字符串转换需指定编码方式,如UTF-8;decode()将字节转为字符串,encode()将字符串转为字节,编码不匹配会导致UnicodeDecodeError或UnicodeEncodeError,应优先使用UTF-8并处理错误以确保数据正确性。

python怎么把字节(bytes)转换为字符串_python字节与字符串的编解码转换

Python里要把字节串(bytes)变成字符串(str),通常用的是

decode()
方法;反过来,想把字符串变成字节串,就用
encode()
。这俩操作的核心,都是要指定一个“编码方式”,比如我们最常用的
'utf-8'
。搞清楚这个,基本就抓住了核心。

在Python里,字节和字符串是两种截然不同的数据类型,这和一些其他语言有点区别,我觉得这是Python设计上一个非常明智的地方,它强制我们去思考数据到底是什么。

当你有了一串字节,比如从网络接收到的数据,或者从二进制文件里读出来的东西,它本质上就是一堆0和1,没有内在的“文字”含义。这时候,如果你想把它当成可读的文本来处理,比如打印出来,或者进行字符串操作,你就得告诉Python,这些字节是按照哪种规则编码成文本的。这就是

decode()
出场的时候:

# 假设我们有一串UTF-8编码的字节
byte_data = b'\xe4\xbd\xa0\xe5\xa5\xbd' # 这是“你好”的UTF-8编码
string_data = byte_data.decode('utf-8')
print(f"字节转换为字符串: {string_data}") # 输出: 你好

# 如果编码不对,就会报错
try:
    byte_data.decode('gbk') # 尝试用GBK解码UTF-8字节
except UnicodeDecodeError as e:
    print(f"解码错误示例: {e}") # 会抛出UnicodeDecodeError

# 处理错误,比如忽略或替换不认识的字符
broken_bytes = b'hello\xed\xa0\xbdworld' # 包含无效的UTF-8序列
safe_string = broken_bytes.decode('utf-8', errors='ignore') # 忽略错误字符
print(f"忽略错误字符: {safe_string}") # 输出: helloworld

replaced_string = broken_bytes.decode('utf-8', errors='replace') # 替换错误字符
print(f"替换错误字符: {replaced_string}") # 输出: hello�world

反过来,当你有一个字符串,比如用户输入的内容,或者代码里定义的一段文本,你想把它发送到网络上,或者写入二进制文件,你就需要把它转换成字节。因为网络和文件系统通常处理的是字节流。这时候,

encode()
就派上用场了:

立即学习Python免费学习笔记(深入)”;

# 一个普通的字符串
my_string = "你好,世界!"

# 将字符串编码为UTF-8字节
utf8_bytes = my_string.encode('utf-8')
print(f"字符串转换为UTF-8字节: {utf8_bytes}") # 输出: b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'

# 编码成GBK字节
gbk_bytes = my_string.encode('gbk')
print(f"字符串转换为GBK字节: {gbk_bytes}") # 输出: b'\xc4\xe3\xda\xcf\xa3\xac\xca\xc0\xbd\xe7\xa3\xa1'

# 如果字符串中包含目标编码无法表示的字符,同样会报错
# 比如,一个GBK无法表示的字符
weird_string = "你好✨" # ✨这个字符GBK不支持
try:
    weird_string.encode('gbk')
except UnicodeEncodeError as e:
    print(f"编码错误示例: {e}") # 会抛出UnicodeEncodeError

# 同样可以处理错误
safe_bytes = weird_string.encode('gbk', errors='replace')
print(f"替换错误字符编码: {safe_bytes}") # 输出: b'\xc4\xe3\xda\xcf??'

这里有个经验之谈,我个人在处理编解码的时候,总是尽量保持一致性,特别是在同一个系统内部,默认都用

utf-8
。这能省去很多不必要的麻烦,因为
utf-8
几乎能表示所有Unicode字符。

Yodayo
Yodayo

一个专为动漫迷和vTuber打造的AI艺术创作平台、交流社区

下载

Python字节和字符串转换中常见的编码问题及应对策略

我发现,在Python里处理字节和字符串的转换,最让人头疼的往往不是忘记调用

encode()
decode()
,而是“编码错误”——那些让人抓狂的
UnicodeDecodeError
UnicodeEncodeError
。这通常发生在两个地方:

  1. UnicodeDecodeError
    当你尝试用一种编码(比如
    'gbk'
    )去解码实际上是另一种编码(比如
    'utf-8'
    )的字节序列时。举个例子,你从一个UTF-8编码的文件里读了一堆字节,但你代码里不小心用了
    data.decode('gbk')
    ,结果就是一堆乱码,或者直接抛出
    UnicodeDecodeError: 'gbk' codec can't decode byte 0xXX in position Y: illegal multibyte sequence
    。这就像你拿着一本英文词典去查中文,肯定对不上号。

    • 应对策略: 核心是找出原始字节的正确编码。如果是在网络通信中,通常协议会指定编码(比如HTTP头部的
      Content-Type
      )。如果是文件,可能需要检查文件本身的元数据,或者根据经验猜测(中文环境可能是
      gbk
      utf-8
      ,英文可能就是
      latin-1
      ascii
      )。如果实在不确定,
      'utf-8'
      是首选,因为它的兼容性最好。如果还不行,可以尝试
      chardet
      这样的第三方库来猜测编码,虽然它也不是百分之百准确,但能提供一个不错的起点。在实在无法确定且又不想程序崩溃时,可以考虑使用
      errors='ignore'
      errors='replace'
      参数,但这会丢失数据,通常只作为最后的手段。
  2. UnicodeEncodeError
    当你尝试用一种编码(比如
    'ascii'
    'gbk'
    )去编码一个包含它不支持字符的字符串时。比如,你的字符串里有表情符号(
    ),但你却想把它编码成
    'gbk'
    ,因为
    gbk
    不支持这些字符,它就会报错:
    UnicodeEncodeError: 'gbk' codec can't encode character '\U00002728' in position X: illegal multibyte sequence

    • 应对策略: 最直接的办法是使用一个能支持所有字符的编码,比如
      'utf-8'
      。如果你确实需要用一个有限的编码(比如为了兼容老系统),那么在编码前,你需要确保字符串里不包含该编码不支持的字符。这可能涉及到对字符串进行清洗,或者在编码时使用
      errors='replace'
      errors='xmlcharrefreplace'
      来替换无法编码的字符。我个人觉得,除非有非常明确的理由,否则尽量坚持使用
      'utf-8'
      来编码字符串,这能避免99%的编码错误。

理解这两类错误发生的根本原因,即编码和解码时使用的字符集不匹配,是解决问题的关键。我总是强调,处理文本数据时,一定要清楚数据的“身份”:它是字节还是字符串?如果是字节,它是什么编码的?如果是字符串,它内部是Unicode,要编码成什么?

在实际应用中,何时以及如何处理Python字节与字符串的转换?

在我日常的开发工作中,字节和字符串的转换简直无处不在。它不是一个孤立的知识点,而是贯穿于数据输入输出的方方面面。我总结了一些常见场景,以及我在这些场景下的处理心得:

  1. 文件I/O:
    • 读写文本文件: 当你用
      open()
      函数打开文件时,如果指定了
      encoding
      参数(比如
      open('file.txt', 'r', encoding='utf-8')
      ),Python会自动帮你处理编解码。你读出来的是字符串,写入的是字符串。这是最省心的做法。
    • 读写二进制文件: 如果你不指定
      encoding
      ,或者以
      'rb'
      /
      'wb'
      模式打开文件,那么你读写的就是原始字节。这时,你从文件读到的数据就是
      bytes
      类型,需要手动
      decode()
      成字符串才能处理

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号