Python 字符串与字节串的区别与转换
发布时间 - 2026-01-31 00:00:00 点击率:次Python 3 中 str 和 bytes 是互不兼容的类型,str 表示 Unicode 文本,bytes 表示原始字节;必须用 encode()/decode() 显式转换,且需指定编码(如 "utf-8"),文件读写、网络请求等 I/O 操作需严格匹配类型。
字符串是 Unicode

Python 3 中 str 和 bytes 是两种完全不同的类型,不能直接拼接或比较。前者表示人类可读的文本(Unicode 码点序列),后者表示原始的 0/1 字节序列。常见错误如 "hello" + b"world" 会直接报 TypeError: can't concat str to bytes。
关键判断依据:文件路径、网络请求体、加密输入等底层 I/O 操作几乎都要求 bytes;而用户输入、日志打印、JSON 解析结果等基本都是 str。
encode() 和 decode() 是唯一安全转换方式
转换必须显式指定编码(encoding),最常用的是 "utf-8"。没有“默认自动识别”这回事——Python 不会猜你存的是 GBK 还是 UTF-8,猜错就出乱码。
-
"你好".encode("utf-8")→b"\xe4\xbd\xa0\xe5\xa5\xbd" -
b"\xe4\xbd\xa0\xe5\xa5\xbd".decode("utf-8")→"你好" - 用错编码会触发
UnicodeDecodeError或UnicodeEncodeError,比如用"gbk"去解一个 UTF-8 字节串 - 某些场景下可用
errors="ignore"或errors="replace"避免崩溃,但会丢失或替换数据,慎用
读写文件时 encoding 参数决定返回类型
打开文件不用 encoding 参数(即默认二进制模式),read() 返回 bytes;显式指定 encoding(如 open("f.txt", "r", encoding="utf-8")),则返回 str。这个参数不只影响读,也影响写入行为。
- 二进制模式:
open("data.bin", "rb")→ 必须用bytes写,read()返回bytes - 文本模式:
open("text.txt", "w", encoding="utf-8")→ 只能用str写,write("abc")合法,write(b"abc")报错 - Windows 上不指定
encoding且用文本模式,可能默认用cp1252,导致中文直接乱码
网络和序列化场景下类型容易被忽略
HTTP 请求体、socket 发送、json.dumps() 输出、pickle 序列化结果……这些操作对输入类型的敏感度极高。例如 requests.post(url, data=b"raw") 发的是字节流,而 data="text" 会被自动编码为 UTF-8 字节再发;但如果你手动 .encode() 了又传给 data=,就可能被二次编码。
-
json.loads()接收str或bytes,但后者必须是 UTF-8 编码,否则报错 -
subprocess.run(..., input=b"xxx")要求bytes,而input="xxx"会尝试用系统默认编码转,不可靠 - 用
bytes.fromhex("aabbcc")或int.to_bytes()构造字节串时,别误以为它能直接当字符串打印——它不是文本
# python
# js
# json
# windows
# 编码
# 字节
# win
# 区别
# 封装
# 字符串
# int
# input
# http
# 的是
# 报错
# 都是
# 你好
# 如果你
# 序列化
# 两种
# 自动识别
# 这回
# 极高
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么为数据库表字段添加索引以优化查询
如何用PHP工具快速搭建高效网站?
如何快速搭建二级域名独立网站?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
如何在景安云服务器上绑定域名并配置虚拟主机?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
如何自定义建站之星模板颜色并下载新样式?
高端网站建设与定制开发一站式解决方案 中企动力
使用C语言编写圣诞表白程序
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Laravel用户密码怎么加密_Laravel Hash门面使用教程
网站优化排名时,需要考虑哪些问题呢?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
高防服务器租用指南:配置选择与快速部署攻略
JS实现鼠标移上去显示图片或微信二维码
Laravel如何升级到最新版本?(升级指南和步骤)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
Linux系统命令中tree命令详解
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
Android实现代码画虚线边框背景效果
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Laravel如何集成Inertia.js与Vue/React?(安装配置)
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
如何用狗爹虚拟主机快速搭建网站?
如何解决hover在ie6中的兼容性问题
如何快速选择适合个人网站的云服务器配置?
如何在IIS7上新建站点并设置安全权限?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
jQuery validate插件功能与用法详解
Android Socket接口实现即时通讯实例代码
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
创业网站制作流程,创业网站可靠吗?
JavaScript如何实现错误处理_try...catch如何捕获异常?
怎么用AI帮你为初创公司进行市场定位分析?
如何在服务器上配置二级域名建站?

