杰瑞科技汇

Python str 如何转 unicode?

核心概念:Python 2 vs. Python 3

你需要理解一个关键点:在 Python 3 中,str 类型本身就是 Unicode 的,Python 3 中不存在“将 str 转为 Unicode”这种说法,因为它们就是一回事。

Python str 如何转 unicode?-图1
(图片来源网络,侵删)

这个问题的真正背景是 Python 2,在 Python 2 中存在两种字符串类型:

  1. str: 字节串,它只是一串原始的字节,没有编码信息,当你处理文本时,如果只用 str,很容易在处理非英文字符(如中文)时出错。
  2. unicode: Unicode 字符串,它内部使用 Unicode 码点来表示字符,可以正确处理世界上几乎所有的文字。

在 Python 2 中,你通常需要将读取到的字节串 (str) 解码成 Unicode 字符串 (unicode) 进行处理,处理完毕后,如果需要写入文件或网络,再编码成特定的字节串(如 UTF-8, GBK)。


Python 2 中的 strunicode

在 Python 2 中,这个过程称为 解码,你需要使用 .decode() 方法。

基本语法

# 原始的字节串
# 注意:在 Python 2 的源码文件头部,最好加上 # -*- coding: utf-8 -*-
# 这样解释器才能正确识别源码文件中的中文字符
my_str = "你好,世界"
# 将 str 解码为 unicode
# 'utf-8' 是字符编码,告诉 Python 如何将这串字节转换成字符
my_unicode = my_str.decode('utf-8')
print type(my_str)       # <type 'str'>
print type(my_unicode)   # <type 'unicode'>
print my_str             # 你好,世界
print my_unicode         # 你好,世界
print repr(my_unicode)   # u'\u4f60\u597d\uff0c\u4e16\u754c'

常见编码

  • 'utf-8': 最通用、最推荐的编码,支持所有字符。
  • 'gbk''gb2312': 中文 Windows 系统上常见的编码。
  • 'latin-1''ascii': ASCII 编码,只能处理英文字符,如果尝试解码非 ASCII 字节,会抛出 UnicodeDecodeError

处理未知编码或编码错误

有时候你可能会遇到编码不匹配的问题,导致 UnicodeDecodeError,这时可以提供 errors 参数来处理错误:

Python str 如何转 unicode?-图2
(图片来源网络,侵删)
  • errors='ignore': 忽略无法解码的字符。
  • errors='replace': 将无法解码的字符替换成一个占位符(通常是 或 )。
# 假设一段用 GBK 编码的字节流,但你错误地用 UTF-8 解码
# b'\xB9\xE3\xCA\xA1\xCA\xA1' 是 "北京" 的 GBK 编码
mixed_bytes = '\xB9\xE3\xCA\xA1\xCA\xA1'.decode('gbk') # 正确
# 错误示范
try:
    wrong_decode = '\xB9\xE3\xCA\xA1\xCA\xA1'.decode('utf-8')
except UnicodeDecodeError as e:
    print "解码失败:", e
# 使用 errors='replace' 来避免程序崩溃
safe_decode = '\xB9\xE3\xCA\xA1\xCA\xA1'.decode('utf-8', errors='replace')
print safe_decode # 输出: ������

Python 3 中的情况

在 Python 3 中,情况得到了极大的简化。

  • str 是 Unicode 字符串,这是你处理文本时默认使用的类型。
  • bytes 是字节串,当你处理二进制数据(如文件、网络传输)时,会用到这个类型。

在 Python 3 中,你做的操作通常是 bytes 解码为 str

bytesstr (解码)

# 这是一个 bytes 对象,注意前面的 b
# 在 Python 3 的源码中,字符串默认是 unicode
my_bytes = b'\xe4\xbd\xa0\xe5\xa5\xbd'  # "你好" 的 UTF-8 编码
# 将 bytes 解码为 str
my_str = my_bytes.decode('utf-8')
print(type(my_bytes))   # <class 'bytes'>
print(type(my_str))     # <class 'str'>
print(my_str)           # 你好

strbytes (编码)

反过来,如果你有一个 str 对象,想把它变成 bytes 以便写入文件或网络,你需要使用 .encode() 方法。

my_str = "你好"
# 将 str 编码为 bytes
my_bytes = my_str.encode('utf-8')
print(type(my_str))   # <class 'str'>
print(type(my_bytes)) # <class 'bytes'>
print(my_bytes)       # b'\xe4\xbd\xa0\xe5\xa5\xbd'

总结与最佳实践

场景 Python 2 (旧版) Python 3 (新版)
目标 将字节串 (str) 转为文本 (unicode) 将字节串 (bytes) 转为文本 (str)
操作 解码 (Decode) 解码 (Decode)
方法 my_str.decode('编码') my_bytes.decode('编码')
反向操作 my_unicode.encode('编码') -> str my_str.encode('编码') -> bytes

最佳实践建议

  1. 尽可能使用 Python 3,它从设计上就解决了 Python 2 的 Unicode 混乱问题,是更现代、更清晰的选择。
  2. 坚持使用 UTF-8,在所有可能的地方(源码文件、数据库、文件存储、网络通信),都统一使用 UTF-8 作为编码标准,这可以避免 90% 以上的编码问题。
  3. 明确区分文本和字节
    • 文本:用 str (Python 3) 或 unicode (Python 2) 表示,这是给人看的内容。
    • 字节:用 bytes (Python 3) 或 str (Python 2) 表示,这是给机器或网络传输用的原始数据。
  4. 在 Python 2 源码文件开头声明编码
    # -*- coding: utf-8 -*-

如果你现在正在维护一个 Python 2 的项目,并且需要处理中文,那么请务必将所有从外部(文件、数据库、网络)获取的 str 数据,第一时间用 .decode('utf-8')(或正确的编码)转换成 unicode,然后在程序内部全部使用 unicode 进行处理,最后在输出时再用 .encode('utf-8') 转换回去。

Python str 如何转 unicode?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇