首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python3 字符串和编码:搞懂这玩意儿,别再乱码了!

Python3 字符串和编码:搞懂这玩意儿,别再乱码了!

原创
作者头像
程序员余子越
发布2025-08-05 18:14:21
发布2025-08-05 18:14:21
21600
代码可运行
举报
运行总次数:0
代码可运行

一、前言:为什么要学字符串和编码?

如果你用 Python 写程序,只要和程序打交道(比如处理文本、接口、文件、网页),几乎绕不开「字符串」和「编码」。特别是当你看到 UnicodeEncodeErrorUnicodeDecodeError 报错时,那种「我做错了什么」的无助感,你懂的。

所以这篇文章我们就来一次性理清楚:

参考文章:Python 字符串和编码 | 简单一点学习

  • Python3 中字符串到底是什么?
  • 编码、解码到底是怎么回事?
  • 为什么会乱码?怎么避免?
  • 实战中该注意哪些坑?

二、字符串基础:str 和 bytes 的区别

2.1 str 是文本,bytes 是字节

Python3 中有两个跟「字符串」相关的类型:

代码语言:javascript
代码运行次数:0
运行
复制
s = "你好,world"   # str 类型
b = b"hello"       # bytes 类型

类型

内容

举例

str

文本(字符)

"你好abc"

bytes

字节(数字)

b"\xe4\xbd\xa0"

重点记住:

  • str 是给人看的
  • bytes 是给计算机传输和存储的

2.2 str 和 bytes 是不能直接拼接的

代码语言:javascript
代码运行次数:0
运行
复制
>>> b"hello" + "世界"
TypeError: can't concat str to bytes

要么编码,要么解码。


三、编码和解码

3.1 什么是编码(encode)

就是把 str(字符)→ 转换成 bytes(字节)

代码语言:javascript
代码运行次数:0
运行
复制
"你好".encode("utf-8")
# 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd'

3.2 什么是解码(decode)

就是把 bytes(字节)→ 转换成 str(字符)

代码语言:javascript
代码运行次数:0
运行
复制
b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode("utf-8")
# 输出:'你好'

3.3 常见编码格式

编码方式

特点

UTF-8

推荐!通用、网页都用它

GBK

中文系统默认,老系统多见

ASCII

英文和数字,最基础

UTF-16

占空间,通常不用


四、为什么会出现乱码?

乱码 = 解码方式 ≠ 编码方式

举个例子:

代码语言:javascript
代码运行次数:0
运行
复制
text = "你好"
b = text.encode("utf-8")
print(b.decode("gbk"))  # 这就乱码了

所以你要记住这句话:编码用什么,解码就用什么!


五、字符串的编码小技巧

5.1 判断字符串类型

代码语言:javascript
代码运行次数:0
运行
复制
isinstance(obj, str)   # 是文本?
isinstance(obj, bytes) # 是字节?

5.2 encode 和 decode 连用

代码语言:javascript
代码运行次数:0
运行
复制
"你好".encode("utf-8").decode("utf-8")

5.3 编码参数的常用技巧

代码语言:javascript
代码运行次数:0
运行
复制
"你好".encode("utf-8", errors="ignore")
"你好".encode("utf-8", errors="replace")

可以避免一些编码错误爆炸。


六、实际场景中怎么用?

6.1 读取文件时指定编码

代码语言:javascript
代码运行次数:0
运行
复制
with open("file.txt", encoding="utf-8") as f:
    content = f.read()

6.2 网络请求获取的是 bytes,要 decode

代码语言:javascript
代码运行次数:0
运行
复制
import requests

r = requests.get("https://example.com")
html = r.content.decode("utf-8")

6.3 从数据库读出来是 bytes?

.decode("utf-8") 转一下。


七、常见坑与解决方案

问题

原因

解决方案

文件读出来是乱码

文件本身是 GBK,你用 utf-8 读了

open(..., encoding="gbk")

API 返回中文乱码

服务端编码是 GBK 或未声明

尝试 response.content.decode(...)

打印日志时报 encode 错误

控制台编码与程序编码不一致

用 encode(errors="replace")

bytes 和 str 混用报错

Python 不允许 str + bytes 拼接

明确转换为统一格式

八、总结回顾

  • Python3 把 strbytes 分得很清楚了。
  • 编码 encode:str → bytes
  • 解码 decode:bytes → str
  • 遇到乱码不要慌,多半是编码没对上。
  • 文件、网络、数据库这些输入输出场景要特别注意编码。

九、额外补充:字符串在内存里是怎么存的?

  • Python3 中所有 str 实际是 Unicode 编码。
  • 内部存储可以是 UTF-8、UTF-16、UTF-32,Python 会自己优化存储结构。
  • 所以你看到的 len(s) 有时不等于实际字节长度:
代码语言:javascript
代码运行次数:0
运行
复制
>>> len("你好")  # 是字符数
2
>>> len("你好".encode("utf-8"))  # 是字节数
6

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言:为什么要学字符串和编码?
  • 二、字符串基础:str 和 bytes 的区别
    • 2.1 str 是文本,bytes 是字节
    • 2.2 str 和 bytes 是不能直接拼接的
  • 三、编码和解码
    • 3.1 什么是编码(encode)
    • 3.2 什么是解码(decode)
    • 3.3 常见编码格式
  • 四、为什么会出现乱码?
  • 五、字符串的编码小技巧
    • 5.1 判断字符串类型
    • 5.2 encode 和 decode 连用
    • 5.3 编码参数的常用技巧
  • 六、实际场景中怎么用?
    • 6.1 读取文件时指定编码
    • 6.2 网络请求获取的是 bytes,要 decode
    • 6.3 从数据库读出来是 bytes?
  • 七、常见坑与解决方案
  • 八、总结回顾
  • 九、额外补充:字符串在内存里是怎么存的?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档