本文目录导读:

我来帮你编写一个通用的乱码修复脚本,以下是一个Python实现的示例,可以处理多种常见的乱码情况:
基础乱码修复脚本
import chardet
import os
from pathlib import Path
def detect_encoding(file_path):
"""检测文件编码"""
with open(file_path, 'rb') as f:
raw_data = f.read()
result = chardet.detect(raw_data)
return result['encoding']
def fix_file_encoding(file_path, target_encoding='utf-8'):
"""
修复文件编码乱码
"""
try:
# 检测原始编码
original_encoding = detect_encoding(file_path)
if not original_encoding:
print(f"无法检测编码: {file_path}")
return False
# 读取文件
with open(file_path, 'rb') as f:
raw_data = f.read()
# 尝试解码
try:
text = raw_data.decode(original_encoding)
except:
# 如果检测的编码不正确,尝试常见编码
for encoding in ['utf-8', 'gbk', 'gb2312', 'latin-1', 'cp936']:
try:
text = raw_data.decode(encoding)
break
except:
continue
else:
print(f"无法解码文件: {file_path}")
return False
# 写入新编码
with open(file_path, 'w', encoding=target_encoding) as f:
f.write(text)
print(f"成功修复: {file_path}")
return True
except Exception as e:
print(f"修复失败 {file_path}: {str(e)}")
return False
def batch_fix_encoding(folder_path, extensions=['.txt', '.csv', '.html', '.xml']):
"""批量修复文件夹中的文件"""
folder = Path(folder_path)
fixed_count = 0
failed_count = 0
for ext in extensions:
for file_path in folder.rglob(f'*{ext}'):
if file_path.is_file():
if fix_file_encoding(file_path):
fixed_count += 1
else:
failed_count += 1
print(f"\n总结: 成功修复 {fixed_count} 个文件, 失败 {failed_count} 个文件")
# 使用示例
if __name__ == "__main__":
# 修复单个文件
fix_file_encoding("example.txt")
# 批量修复文件夹
batch_fix_encoding("./乱码文件夹")
更强大的乱码修复版本
import chardet
import os
import codecs
from pathlib import Path
class EncodingFixer:
def __init__(self):
self.common_encodings = [
'utf-8', 'gbk', 'gb2312', 'gb18030',
'big5', 'latin-1', 'cp1252', 'shift_jis',
'euc-kr', 'iso-8859-1'
]
def detect_encoding_smart(self, file_path):
"""智能检测编码"""
with open(file_path, 'rb') as f:
raw_data = f.read()
# 使用 chardet 检测
result = chardet.detect(raw_data)
if result['confidence'] > 0.7:
return result['encoding']
# 如果置信度低,尝试其他编码
for encoding in self.common_encodings:
try:
raw_data.decode(encoding)
return encoding
except:
continue
return None
def fix_garbled_text(self, text):
"""修复常见的乱码模式"""
# 常见乱码映射
garbled_map = {
'锘挎': '无', # UTF-8 BOM 导致的乱码
'绗�': '第',
'涓�': '中',
'浜�': '人',
'鍦�': '地',
'涓�': '中',
'绗�': '第',
}
for garbled, correct in garbled_map.items():
text = text.replace(garbled, correct)
return text
def fix_file(self, input_path, output_path=None, encoding=None):
"""
修复文件乱码
"""
try:
# 检测编码
detected_encoding = self.detect_encoding_smart(input_path)
encoding = encoding or detected_encoding
if not encoding:
print(f"无法确定编码: {input_path}")
return False
# 读取并修复
with open(input_path, 'rb') as f:
raw_data = f.read()
# 去除BOM
if raw_data.startswith(codecs.BOM_UTF8):
raw_data = raw_data[3:]
# 解码
try:
text = raw_data.decode(encoding)
except UnicodeDecodeError:
# 尝试用忽略错误的方式解码
text = raw_data.decode(encoding, errors='ignore')
# 修复常见乱码
text = self.fix_garbled_text(text)
# 确定输出路径
output_path = output_path or input_path
# 创建备份
if input_path == output_path:
backup_path = input_path + '.bak'
with open(backup_path, 'wb') as f:
f.write(raw_data)
print(f"已创建备份: {backup_path}")
# 写入修复后的内容(UTF-8)
with open(output_path, 'w', encoding='utf-8') as f:
f.write(text)
print(f"成功修复: {input_path}")
return True
except Exception as e:
print(f"修复失败 {input_path}: {str(e)}")
return False
def batch_fix(self, folder_path, output_folder=None, extensions=None):
"""批量修复文件夹中的文件"""
if extensions is None:
extensions = ['.txt', '.csv', '.html', '.xml', '.json', '.log', '.md']
folder = Path(folder_path)
if output_folder:
output_folder = Path(output_folder)
output_folder.mkdir(parents=True, exist_ok=True)
results = {'success': 0, 'fail': 0}
for ext in extensions:
for file_path in folder.rglob(f'*{ext}'):
if file_path.is_file():
if output_folder:
rel_path = file_path.relative_to(folder)
output_path = output_folder / rel_path
output_path.parent.mkdir(parents=True, exist_ok=True)
else:
output_path = None
if self.fix_file(file_path, output_path):
results['success'] += 1
else:
results['fail'] += 1
print(f"\n批量修复完成:")
print(f"成功: {results['success']} 个文件")
print(f"失败: {results['fail']} 个文件")
return results
# 使用示例
if __name__ == "__main__":
fixer = EncodingFixer()
# 修复单个文件并保存到新位置
fixer.fix_file("乱码.txt", "修复后.txt")
# 直接修复原文件(会自动创建备份)
fixer.fix_file("原始文件.txt")
# 批量修复文件夹
fixer.batch_fix("./输入文件夹", "./输出文件夹")
命令行版本
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""乱码修复脚本 - 命令行工具"""
import argparse
import sys
from pathlib import Path
# 导入上面的 EncodingFixer 类
def main():
parser = argparse.ArgumentParser(description='乱码修复工具')
parser.add_argument('path', help='文件或文件夹路径')
parser.add_argument('-o', '--output', help='输出路径(可选)')
parser.add_argument('-e', '--encoding', help='指定编码(可选)')
parser.add_argument('--extensions', nargs='+',
default=['.txt', '.csv', '.html', '.xml', '.log'],
help='处理的文件扩展名')
parser.add_argument('--backup', action='store_true',
help='是否创建备份')
args = parser.parse_args()
fixer = EncodingFixer()
path = Path(args.path)
if path.is_file():
# 修复单个文件
success = fixer.fix_file(
path,
args.output,
args.encoding
)
sys.exit(0 if success else 1)
elif path.is_dir():
# 批量修复文件夹
results = fixer.batch_fix(
path,
args.output,
args.extensions
)
sys.exit(0 if results['fail'] == 0 else 1)
else:
print(f"路径不存在: {path}")
sys.exit(1)
if __name__ == "__main__":
main()
使用说明
安装依赖
pip install chardet
基本使用
# 1. 修复单个文件 python fix_encoding.py 乱码文件.txt # 2. 修复并保存到新文件 python fix_encoding.py 乱码文件.txt -o 修复后.txt # 3. 批量修复文件夹 python fix_encoding.py ./乱码文件夹 -o ./修复后文件夹 # 4. 指定编码 python fix_encoding.py 乱码文件.txt -e gbk # 5. 指定文件类型 python fix_encoding.py ./文件夹 --extensions .txt .csv .json # 6. 创建备份 python fix_encoding.py 乱码文件.txt --backup
注意事项
- 建议先处理少量文件测试效果
- 重要文件请先备份
- 不同的编码问题可能需要调整参数
- 对于复杂的乱码,可能需要手动处理
这个脚本可以处理大部分常见的编码乱码问题,包括UTF-8、GBK、BIG5等编码之间的转换问题。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播