当前位置:首页>python>从零开始学python-编码

从零开始学python-编码

  • 2026-10-09 04:18:05
从零开始学python-编码

Hi~新朋友,记得点上面蓝字(网虫root)关注哟~

前言:

   主要分享的是Python版本为Python3的内容。

一、编码基础概念

🚀什么是编码?

     计算机只识别二进制数据(0 和 1),而人类使用的是字符(如汉字、字母)。编码是将字符(如字母、数字、符号)转换为计算机可存储和传输的二进制数据的过程,解码则是相反的过程。

  • 错误示例:用 UTF-8 编码的中文文件,用 ASCII 解码 → 乱码(如 ``)。

  • 关键点:编码必须与解码方式一致,否则数据会损坏。

二、Python 中的编码基础(Python 3)

  • 字符串(str):默认是 Unicode 字符串(存储字符,如 "你好")。

  • 字节串(bytes):二进制数据(存储编码后的字节,如 b'\xe4\xbd\xa0\xe5\xa5\xbd')。

  • 默认编码:Python 3 默认使用 UTF-8 作为字符串的编码方式(但文件操作需显式指定)。

📌 重要提示:Python 2 有 str(字节)和 unicode 类型,但 Python 3 统一为 str(Unicode)和 bytes,避免了历史混乱。

2.1 常见编码标准

  • ASCII:最早的标准,仅支持128个字符(英文字母、数字、标点)

  • Latin-1 (ISO-8859-1):扩展了ASCII,支持西欧语言

  • UTF-8:变长编码,兼容ASCII,支持所有Unicode字符(最常用)

  • UTF-16:定长或变长编码,用于某些系统和语言

  • GBK/GB2312:中文编码标准

  • Shift-JIS:日文编码标准

2.2 str 与 bytes 的区分

Python 3 最重要的改进之一是明确区分文本(str)和二进制数据(bytes):

① 文本字符串(str) - 存储Unicode字符text = "你好,世界!"print(type(text))  # <class 'str'>② 字节序列(bytes) - 存储二进制数据binary = b"Hello, World!"print(type(binary))  # <class 'bytes'>

2.3 默认编码

Python 3 源码默认使用 UTF-8 编码,字符串在内存中以 Unicode 形式存储。

① 检查系统默认编码import sysprint(sys.getdefaultencoding())  # 通常输出 'utf-8'② 文件系统编码print(sys.getfilesystemencoding())

三、编码转换操作

3.1 字符串编码(str → bytes)

使用 encode() 方法将字符串转换为字节串:

text = "你好"  # Unicode 字符串encoded_bytes = text.encode('utf-8')  # 编码为 UTF-8 字节print(encoded_bytes)  # 输出: b'\xe4\xbd\xa0\xe5\xa5\xbd'

3.2 字节解码(bytes → str)

使用 decode() 方法将字节串解码为字符串:

encoded_bytes = b'\xe4\xbd\xa0\xe5\xa5\xbd'decoded_text = encoded_bytes.decode('utf-8')  # 用 UTF-8 解码print(decoded_text)  # 输出: 你好

3.3 文件读写:必须指定编码!

① 写入文件(指定 UTF-8)with open('example.txt', 'w', encoding='utf-8') as f:    f.write("你好,Python!")② 读取文件(必须匹配写入编码)with open('example.txt', 'r', encoding='utf-8') as f:    content = f.read()print(content)  # 输出: 你好,Python!

⚠️ 常见错误:省略 encoding='utf-8' → 用系统默认编码(如 Windows 默认 cp936),导致中文乱码。

四、常见问题与解决方案

4.1. UnicodeDecodeError: 'utf-8' codec can't decode byte...

🔍原因:用 UTF-8 解码了非 UTF-8 数据(如用 GBK 编码的文件)。

💡解决:

# 尝试用 GBK 解码(假设文件是 GBK 编码)withopen('wrong_encoding.txt', 'r', encoding='gbk') as f:    content = f.read()

4.2. UnicodeEncodeError: 'ascii' codec can't encode character...

🔍原因:默认 ASCII 编码无法处理非 ASCII 字符(如中文)。

💡解决:显式指定 UTF-8:

text = "你好"text.encode('utf-8')  # 正确# text.encode()  # 错误!默认 ASCII 会报错

4.3. 处理错误的编码(errors 参数)

# 用 'replace' 忽略错误字符(替换为 '?')b'\xe4'.decode('utf-8', errors='replace')  # 输出: '?'

4.4 统一使用 UTF-8

  • 源代码文件保存为 UTF-8

  • 内部处理统一使用 UTF-8

  • 文件读写默认使用 UTF-8

五、最佳实践:避免编码陷阱

  • 文件操作必须指定编码:open(..., encoding='utf-8')。

  • 网络传输统一用 UTF-8:HTTP 头、JSON 数据默认 UTF-8。

  • 避免使用默认编码:Python 3 的 open() 默认编码是系统相关(如 Linux 为 UTF-8,Windows 为 cp936),显式指定更安全。

  • 检查输入源:如果从外部获取数据(如数据库、API),先确认编码方式。

记住黄金法则:尽早解码,晚点编码——在程序内部处理时使用 Unicode 字符串,只在输入输出时进行编码转换。

【微语】过去的事,可以不忘,但一定要放下。背着旧行李,走不了新路。

网虫root

期待你的

分享

点赞

在看

最新文章

随机文章