杰瑞科技汇

Python unicode编码如何转中文?

核心概念

首先要理解,Python 3 的字符串在内存中默认就是 Unicode 编码,当你看到一个像 \u4e2d\u6587 这样的字符串时,它本身就是一个包含“中”和“文”这两个字符的 Unicode 字符串,我们通常说的“转换”,其实是指解码(从字节流解码)或处理(处理转义序列字符串)。

Python unicode编码如何转中文?-图1
(图片来源网络,侵删)

处理 \u 转义序列字符串

如果你有一个字符串变量,其内容是 \u 开头的转义序列,s = "\u4e2d\u6587",你不需要做任何事,因为它已经是中文了。

但如果你得到的是一个字面量字符串,比如从某个文件或网络请求中读到了 "\\u4e2d\\u6587"(注意,这里有两个反斜杠,因为反斜杠在字符串中是转义字符),你需要先将其转换成真正的转义序列,然后再处理。

使用 encode().decode()

这是最简洁、最 Pythonic 的方法。

# 假设这是从某个地方(如JSON文件)读取的原始字符串
# 注意:在Python字符串字面量中,'\\' 表示一个反斜杠 '\'
unicode_str = "\\u4e2d\\u6587\\u592a\\u7231\\u4f60" 
# 1. 先用 'unicode_escape' 编码,把 '\\u' 变成真正的 \u 转义序列
# 2. 再用 'utf-8' 解码,将转义序列转换成中文字符
chinese_str = unicode_str.encode('utf-8').decode('unicode_escape')
print(chinese_str)
# 输出: 中文太爱你

工作原理:

Python unicode编码如何转中文?-图2
(图片来源网络,侵删)
  1. encode('unicode_escape'):将字符串 "\\u4e2d\\u6587" 中的双反斜杠 \\ 转换为单反斜杠 \,使其变成 Python 可以识别的 Unicode 转义序列字符串 "\u4e2d\u6587",这个过程返回的是字节流。
  2. decode('utf-8'):将这个包含转义序列的字节流,按照 UTF-8 编码规则进行解码,最终得到我们想要的 "中文太爱你" 字符串。

使用 ast.literal_eval

ast (Abstract Syntax Trees) 模块中的 literal_eval 函数可以安全地评估一个字符串字面量,它也能正确处理 \u 转义序列。

import ast
unicode_str = "\\u4e2d\\u6587\\u592a\\u7231\\u4f60"
# literal_eval 会将字符串中的转义序列解释为真正的字符
chinese_str = ast.literal_eval(f'"{unicode_str}"') # 注意要用引号包起来
print(chinese_str)
# 输出: 中文太爱你

工作原理: ast.literal_eval 会解析字符串 '"\\u4e2d\\u6587"',识别出 \u 是一个 Unicode 字符的转义表示,并将其转换为对应的字符,这种方法非常安全,因为它只解析字面量,不会执行任意代码。


处理 Unicode 码点

如果你有一串数字,也就是 Unicode 码点("中" 的码点是 20013),你想把它转换成中文字符。

使用 chr() 函数

chr() 函数可以将一个整数(Unicode 码点)转换为其对应的字符。

Python unicode编码如何转中文?-图3
(图片来源网络,侵删)
# '中' 的 Unicode 码点是 20013
code_point = 20013
chinese_char = chr(code_point)
print(chinese_char)
# 输出: 中
# 也可以处理多个码点
code_points = [20013, 25991]
chinese_str = "".join([cp for cp in map(chr, code_points)])
print(chinese_str)
# 输出: 中文

处理 Unicode 编码的字节流

如果你得到的是一堆字节,这些字节是用某种 Unicode 编码(如 UTF-16、UTF-32)表示的中文字符,你需要使用 decode() 方法来解码。

处理 UTF-16 编码的字节流

# "中文" 的 UTF-16 编码 (通常以 BOM 开头)
# \xff\xfe 是小端序 BOM (Byte Order Mark)
utf16_bytes = b'\xff\xfe\x2d\x4e\x87\x65'
# 使用 'utf-16' 解码
chinese_str = utf16_bytes.decode('utf-16')
print(chinese_str)
# 输出: 中文

处理 UTF-8 编码的字节流

这是最常见的场景,因为 UTF-8 是互联网上最通用的编码。

# "你好" 的 UTF-8 编码
utf8_bytes = b'\xe4\xbd\xa0\xe5\xa5\xbd'
# 使用 'utf-8' 解码
chinese_str = utf8_bytes.decode('utf-8')
print(chinese_str)
# 输出: 你好

完整示例与常见问题

场景:从 JSON 文件中读取

JSON 文件中的非 ASCII 字符通常会被转义为 \u 形式,当你用 Python 的 json 模块加载时,它会自动为你完成转换。

import json
# 假设有一个 data.json 文件,内容如下:
# {"message": "\u4f60\u597d\uff0c\u4e16\u754c!"}
with open('data.json', 'r', encoding='utf-8') as f:
    data = json.load(f) # json.load 会自动处理 \u 转义
print(data["message"])
# 输出: 你好,世界!

注意:这里你不需要手动调用 encode().decode()json 库已经为你做好了,如果你手动对 data["message"] 的值再处理一次,反而会出错。

场景:处理错误的编码

如果你遇到乱码,,这通常是因为源文件是 UTF-8 编码,但你用错误的编码(如 latin-1gbk)去读取了。

# 假设这是用错误的编码读取到的乱码字符串
wrong_str = "æ–å¿ä¹ä¹"
# 它的原始编码是 UTF-8,但我们用 latin-1 解码了
# 要还原,我们需要先用 latin-1 编码,再用 utf-8 解码
correct_bytes = wrong_str.encode('latin-1')
chinese_str = correct_bytes.decode('utf-8')
print(chinese_str)
# 输出: 新年快乐

重要提示:这种方法并不总是有效,它依赖于错误的编码和原始编码之间的特定关系,最好的办法是从源头确保使用正确的编码。

场景 输入示例 推荐方法 代码示例
处理 \u 转义字符串 "\\u4e2d\\u6587" encode('unicode_escape').decode('utf-8') s.encode('utf-8').decode('unicode_escape')
处理 Unicode 码点 20013 chr() chr(20013)
处理 Unicode 字节流 b'\xe4\xbd\xa0\xe5\xa5\xbd' decode('utf-8') b.decode('utf-8')
从 JSON 加载(自动处理) {"text": "\u4f60\u597d"} json.load() json.load(f)

希望这个详细的解释能帮助你解决 Unicode 编码转换的问题!

分享:
扫描分享到社交APP
上一篇
下一篇