11.编码
1.字符编码处理与文本分析
1.1 题目背景
你正在开发一个文本分析工具,需要处理来自不同来源的文本数据。该工具需要能够:
- 识别和处理不同编码的文本文件
- 分析文本中各种字符的编码信息
- 处理编码转换和乱码修复
- 生成文本编码报告
1.2 题目要求
请实现以下三个函数:
1.2.1. 字符编码分析函数
def analyze_text_encoding(text):
"""
分析文本中字符的编码信息
参数:
text: 输入文本字符串
返回:
包含编码分析信息的字典,格式如下:
{
"total_chars": 总字符数,
"ascii_chars": ASCII字符数,
"unicode_chars": 非ASCII字符数,
"utf8_bytes": UTF-8编码后的字节数,
"character_details": [{"char": "H", "unicode": "U+0048", "utf8_bytes": 1}, ...]
}
示例:
analyze_text_encoding("Hello 世界")
# 应返回包含字符'H'的Unicode码点U+0048等信息
"""
1.2.2. 编码转换函数
def convert_encoding(text, target_encoding='utf-8'):
"""
将文本转换为指定编码格式
参数:
text: 输入文本字符串
target_encoding: 目标编码格式 ('utf-8', 'ascii', 'gbk', 'utf-16')
返回:
编码后的字节数组(bytes 对象)
要求:
- 如果字符无法用目标编码表示,用'?'替换
- 处理编码异常情况
示例:
convert_encoding("Hello 世界", 'ascii') -> b'Hello ??'
"""
1.2.3. 乱码检测与修复函数
def detect_and_fix_encoding(data_bytes, possible_encodings=['utf-8', 'gbk', 'ascii']):
"""
检测字节数据的编码格式并尝试修复乱码
参数:
data_bytes: 字节数据
possible_encodings: 可能的编码列表
返回:
字典包含以下信息:
{
"detected_encoding": 检测到的编码,
"decoded_text": 解码后的文本,
"success": 是否成功解码,
"error_info": 错误信息(如果有)
}
要求:
- 尝试用不同编码解码数据
- 选择解码结果最合理的编码
- 处理解码失败的情况
示例:
# 假设有GBK编码的"中文"被误用UTF-8解码
gbk_bytes = "中文".encode('gbk')
result = detect_and_fix_encoding(gbk_bytes)
# 应能正确识别并解码
"""
1.2.4. 测试用例
# 测试数据:用于字符编码分析的字符串列表
test_texts = [
"Hello World",
"Hello 世界 🌍",
"Python编程😊🎉"
]
# 分隔线,标识编码转换测试的开始
# 定义一个待转换的文本
test_text = "Hello 世界"
# 需要测试的编码类型列表
encodings = ['ascii', 'utf-8', 'gbk']
# 分隔线,标识乱码检测测试的开始
# 定义乱码检测测试用例,包含要编码的文本和采用的编码方式
test_texts = [
"Hello World",
"Hello 世界 🌍",
"Python编程😊🎉"
]
# 定义乱码检测测试用例,包含要编码的文本和采用的编码方式
test_cases = [
("中文", "gbk"),
("Hello 世界", "utf-8"),
("Python编程", "utf-8")
]
1.2.5. 预期输出示例
文本: "Hello World"
总字符数: 11
ASCII字符数: 11
Unicode字符数: 0
UTF-8字节数: 11
字符详情 (前3个):
{'char': 'H', 'unicode': 'U+0048', 'utf8_bytes': 1, 'is_ascii': True}
{'char': 'e', 'unicode': 'U+0065', 'utf8_bytes': 1, 'is_ascii': True}
{'char': 'l', 'unicode': 'U+006C', 'utf8_bytes': 1, 'is_ascii': True}
文本: "Hello 世界 🌍"
总字符数: 10
ASCII字符数: 7
Unicode字符数: 3
UTF-8字节数: 17
字符详情 (前3个):
{'char': 'H', 'unicode': 'U+0048', 'utf8_bytes': 1, 'is_ascii': True}
{'char': 'e', 'unicode': 'U+0065', 'utf8_bytes': 1, 'is_ascii': True}
{'char': 'l', 'unicode': 'U+006C', 'utf8_bytes': 1, 'is_ascii': True}
文本: "Python编程😊🎉"
总字符数: 10
ASCII字符数: 6
Unicode字符数: 4
UTF-8字节数: 20
字符详情 (前3个):
{'char': 'P', 'unicode': 'U+0050', 'utf8_bytes': 1, 'is_ascii': True}
{'char': 'y', 'unicode': 'U+0079', 'utf8_bytes': 1, 'is_ascii': True}
{'char': 't', 'unicode': 'U+0074', 'utf8_bytes': 1, 'is_ascii': True}
=== 编码转换测试 ===
"Hello 世界" -> ASCII: b'Hello ??'
"Hello 世界" -> UTF-8: b'Hello \xe4\xb8\x96\xe7\x95\x8c'
"Hello 世界" -> GBK: b'Hello \xca\xc0\xbd\xe7'
=== 乱码检测测试 ===
原始文本: "中文" (使用gbk编码)
检测到编码: gbk
解码成功: True
解码结果: 中文
原始文本: "Hello 世界" (使用utf-8编码)
检测到编码: utf-8
解码成功: True
解码结果: Hello 世界
原始文本: "Python编程" (使用utf-8编码)
检测到编码: utf-8
解码成功: True
解码结果: Python编程