本文目录导读:

我来详细介绍Python中常见的文本编码转换方法:
基本编码转换操作
字符串与字节串转换
# 字符串转字节串(编码)
text = "你好,世界!"
utf8_bytes = text.encode('utf-8')
gbk_bytes = text.encode('gbk')
print(f"UTF-8字节: {utf8_bytes}")
print(f"GBK字节: {gbk_bytes}")
# 字节串转字符串(解码)
utf8_decoded = utf8_bytes.decode('utf-8')
gbk_decoded = gbk_bytes.decode('gbk')
print(f"UTF-8解码: {utf8_decoded}")
print(f"GBK解码: {gbk_decoded}")
常见编码转换场景
GBK与UTF-8互转
# GBK转UTF-8
def gbk_to_utf8(gbk_text):
"""将GBK编码的字符串转为UTF-8"""
# 先解码为Unicode,再编码为UTF-8
if isinstance(gbk_text, bytes):
return gbk_text.decode('gbk').encode('utf-8')
else:
return gbk_text.encode('gbk').decode('gbk').encode('utf-8')
# UTF-8转GBK
def utf8_to_gbk(utf8_text):
"""将UTF-8编码的字符串转为GBK"""
if isinstance(utf8_text, bytes):
return utf8_text.decode('utf-8').encode('gbk')
else:
return utf8_text.encode('utf-8').decode('utf-8').encode('gbk')
# 示例
text = "编码转换测试"
gbk_bytes = text.encode('gbk')
utf8_bytes = text.encode('utf-8')
print(f"原始文本: {text}")
print(f"GBK转UTF-8: {gbk_to_utf8(gbk_bytes)}")
print(f"UTF-8转GBK: {utf8_to_gbk(utf8_bytes)}")
处理编码错误
# 忽略错误
def safe_decode(text_bytes, encoding='utf-8'):
"""安全解码,忽略无法解码的字符"""
try:
return text_bytes.decode(encoding)
except UnicodeDecodeError:
return text_bytes.decode(encoding, errors='ignore')
# 替换错误字符
def safe_decode_replace(text_bytes, encoding='utf-8'):
"""安全解码,替换无法解码的字符"""
return text_bytes.decode(encoding, errors='replace')
# 示例
byte_data = b'\xff\xfe\x41\x00\x42\x00' # 非标准UTF-8数据
print(f"忽略错误: {safe_decode(byte_data)}")
print(f"替换错误: {safe_decode_replace(byte_data)}")
文件编码转换
读取和写入不同编码的文件
def convert_file_encoding(input_file, output_file,
input_encoding='gbk', output_encoding='utf-8'):
"""转换文件编码"""
try:
# 以输入编码读取文件
with open(input_file, 'r', encoding=input_encoding) as f:
content = f.read()
# 以输出编码写入文件
with open(output_file, 'w', encoding=output_encoding) as f:
f.write(content)
print(f"文件编码转换成功: {input_encoding} -> {output_encoding}")
except Exception as e:
print(f"转换失败: {e}")
# 使用示例
# convert_file_encoding('input.txt', 'output.txt', 'gbk', 'utf-8')
批量处理多个文件
import os
def batch_convert_encoding(directory, input_encoding='gbk',
output_encoding='utf-8', file_extensions=['.txt']):
"""批量转换目录下所有文件的编码"""
for filename in os.listdir(directory):
if any(filename.endswith(ext) for ext in file_extensions):
filepath = os.path.join(directory, filename)
try:
with open(filepath, 'r', encoding=input_encoding) as f:
content = f.read()
with open(filepath, 'w', encoding=output_encoding) as f:
f.write(content)
print(f"已转换: {filename}")
except Exception as e:
print(f"转换失败 {filename}: {e}")
自动检测编码
import chardet
def detect_and_convert(text_bytes, target_encoding='utf-8'):
"""自动检测编码并转换为目标编码"""
# 检测原始编码
result = chardet.detect(text_bytes)
source_encoding = result['encoding']
confidence = result['confidence']
print(f"检测到编码: {source_encoding} (置信度: {confidence:.2%})")
try:
# 解码并重新编码
text = text_bytes.decode(source_encoding)
return text.encode(target_encoding)
except (UnicodeDecodeError, UnicodeEncodeError) as e:
print(f"转换失败: {e}")
return None
# 示例
unknown_encoded = b'\xc4\xe3\xba\xc3' # GBK编码的"你好"
converted = detect_and_convert(unknown_encoded, 'utf-8')
if converted:
print(f"原始字节: {unknown_encoded}")
print(f"转换后: {converted.decode('utf-8')}")
实际应用案例
处理网页编码
import requests
def fetch_and_convert_url(url, target_encoding='utf-8'):
"""获取网页内容并转换编码"""
response = requests.get(url)
# 检测响应编码
content_encoding = response.encoding
print(f"原始编码: {content_encoding}")
# 转换为目标编码
content = response.content
if content_encoding.lower() != target_encoding.lower():
content = content.decode(content_encoding).encode(target_encoding)
return content
# 示例
# result = fetch_and_convert_url('https://example.com/gbk-page')
# print(result.decode('utf-8'))
CSV文件编码转换
import csv
def convert_csv_encoding(input_file, output_file,
input_encoding='gbk', output_encoding='utf-8'):
"""转换CSV文件编码"""
with open(input_file, 'r', encoding=input_encoding) as fin:
reader = csv.reader(fin)
rows = list(reader)
with open(output_file, 'w', encoding=output_encoding, newline='') as fout:
writer = csv.writer(fout)
writer.writerows(rows)
print(f"CSV文件编码转换完成: {len(rows)}行")
# 使用示例
# convert_csv_encoding('input.csv', 'output.csv', 'gbk', 'utf-8')
实用的编码转换函数
def universal_converter(text, target_encoding='utf-8'):
"""通用编码转换函数"""
if isinstance(text, bytes):
# 如果是字节串,尝试常见编码
encodings = ['utf-8', 'gbk', 'gb2312', 'big5', 'ascii']
for enc in encodings:
try:
decoded = text.decode(enc)
return decoded.encode(target_encoding)
except UnicodeDecodeError:
continue
raise ValueError("无法识别的编码")
elif isinstance(text, str):
# 如果是字符串,直接编码
return text.encode(target_encoding)
else:
raise TypeError("不支持的输入类型")
# 测试
bytes_data = b'\xc4\xe3\xba\xc3' # GBK编码
result = universal_converter(bytes_data, 'utf-8')
print(f"转换结果: {result.decode('utf-8')}")
注意事项
- 处理错误: 始终使用try-except捕获编码异常
- 指定编码: 读写文件时明确指定编码
- 备份数据: 批量转换前先备份原始文件
- 测试验证: 转换后验证文本是否完整正确
这些案例涵盖了Python中进行编码转换的常见场景,可以根据实际需求选择合适的方法。