peixue-dev/Archive/[一次性]批量修复乱码问题-Python脚本-2026-01-27.py

255 lines
7.4 KiB
Python
Raw Normal View History

2026-02-28 17:26:03 +08:00
# -*- coding: utf-8 -*-
"""
批量修复Vue文件中文乱码问题
将GBK错误编码的中文转换为正确的UTF-8编码
"""
import os
import re
import chardet
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_garbled_text(text):
"""修复乱码文本"""
# 常见的乱码模式和对应的正确文本
replacements = {
# 基础词汇
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '加载',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '加载中',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '成功',
'<EFBFBD>ɹ<EFBFBD>': '成功',
'ʧ<EFBFBD><EFBFBD>': '失败',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>': '加载失败',
'<EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>¼ʧ<EFBFBD><EFBFBD>': '加载记录失败',
'<EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD>׼<EFBFBD>¼ʧ<EFBFBD><EFBFBD>': '加载交易记录失败',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>': '加载统计失败',
# 状态相关
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '处理中',
'<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>': '已取消',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '已完成',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '进行中',
'<EFBFBD>ȴ<EFBFBD>': '等待',
'<EFBFBD><EFBFBD>ʼ': '开始',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '结束',
# 类型相关
'ȫ<EFBFBD><EFBFBD>': '全部',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '本周',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '本月',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '收入',
'֧<EFBFBD><EFBFBD>': '支出',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '充值',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '提现',
'֧<EFBFBD><EFBFBD>': '支付',
'<EFBFBD>˿<EFBFBD>': '退款',
# 学习相关
'ѧϰ': '学习',
'ѧ<EFBFBD><EFBFBD>': '学生',
'<EFBFBD><EFBFBD>ʦ': '老师',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '内容',
'<EFBFBD><EFBFBD>ҵ': '作业',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '情况',
'<EFBFBD><EFBFBD><EFBFBD>': '评语',
'<EFBFBD><EFBFBD><EFBFBD>': '评分',
'<EFBFBD><EFBFBD>¼': '记录',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '暂无',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '课程',
'<EFBFBD>б<EFBFBD>': '列表',
'<EFBFBD><EFBFBD>ϸ': '详细',
# 统计相关
'<EFBFBD>ۼ<EFBFBD>': '累计',
'Сʱ': '小时',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '次数',
'ƽ<EFBFBD><EFBFBD>': '平均',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '总计',
'ͳ<EFBFBD><EFBFBD>': '统计',
# 操作相关
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '添加',
'ɾ<EFBFBD><EFBFBD>': '删除',
'<EFBFBD>': '编辑',
'ȷ<EFBFBD><EFBFBD>': '确定',
'ȡ<EFBFBD><EFBFBD>': '取消',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '保存',
'<EFBFBD>ύ': '提交',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '修改',
'<EFBFBD><EFBFBD>ѯ': '查询',
'ˢ<EFBFBD><EFBFBD>': '刷新',
# 提示相关
'<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>': '还没有',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '信息',
'û<EFBFBD>и<EFBFBD><EFBFBD><EFBFBD>': '没有更多',
'<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD>': '加载更多',
'<EFBFBD><EFBFBD><EFBFBD>': '暂无',
'<EFBFBD><EFBFBD>': '',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '输入',
'<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>': '请选择',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '请输入',
# 金额相关
'<EFBFBD><EFBFBD>': '¥',
'<EFBFBD><EFBFBD><EFBFBD>': '余额',
'<EFBFBD><EFBFBD><EFBFBD>': '金额',
'<EFBFBD>۸<EFBFBD>': '价格',
# 服务相关
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '陪伴服务',
'<EFBFBD><EFBFBD><EFBFBD>Ա': '陪伴员',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '分钟',
'<EFBFBD><EFBFBD>': '',
'<EFBFBD><EFBFBD>': '',
'<EFBFBD><EFBFBD>': '',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '服务',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '订单',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '工单',
# 用户相关
'<EFBFBD>û<EFBFBD>': '用户',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '家长',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '管理',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʦ': '管理师',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '服务商',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '分销员',
# 时间相关
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '今天',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '昨天',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '明天',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '本周',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '本月',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '今年',
# 地址相关
'<EFBFBD><EFBFBD>ַ': '地址',
'λ<EFBFBD><EFBFBD>': '位置',
'<EFBFBD><EFBFBD>ǩ': '标签',
# 消息相关
'<EFBFBD><EFBFBD>Ϣ': '消息',
'֪ͨ': '通知',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '提醒',
# 反馈相关
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '反馈',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '建议',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '评价',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '投诉',
# 其他常用
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '详情',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '设置',
'<EFBFBD>˳<EFBFBD>': '退出',
'<EFBFBD><EFBFBD>¼': '登录',
'ע<EFBFBD><EFBFBD>': '注册',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '密码',
'<EFBFBD>ֻ<EFBFBD>': '手机',
'<EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD>': '验证码',
'<EFBFBD><EFBFBD>ע': '关注',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '收藏',
'<EFBFBD><EFBFBD><EFBFBD><EFBFBD>': '分享',
}
result = text
for old, new in replacements.items():
result = result.replace(old, new)
return result
def fix_vue_file(file_path):
"""修复单个Vue文件"""
try:
# 读取文件
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
# 检查是否包含乱码
if '<EFBFBD><EFBFBD>' not in content and 'ȫ<EFBFBD><EFBFBD>' not in content and 'ѧϰ' not in content:
return False, "无乱码"
# 修复乱码
fixed_content = fix_garbled_text(content)
# 如果内容有变化,写回文件
if fixed_content != content:
with open(file_path, 'w', encoding='utf-8', newline='\n') as f:
f.write(fixed_content)
return True, "已修复"
else:
return False, "无变化"
except Exception as e:
return False, f"错误: {str(e)}"
def scan_and_fix_directory(directory):
"""扫描并修复目录下的所有Vue文件"""
fixed_files = []
skipped_files = []
error_files = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith('.vue'):
file_path = os.path.join(root, file)
success, message = fix_vue_file(file_path)
if success:
fixed_files.append(file_path)
print(f"✓ 已修复: {file_path}")
elif "错误" in message:
error_files.append((file_path, message))
print(f"✗ 错误: {file_path} - {message}")
else:
skipped_files.append(file_path)
return fixed_files, skipped_files, error_files
if __name__ == '__main__':
# 设置要扫描的目录
target_dir = 'peidu/uniapp/src'
print("=" * 60)
print("开始批量修复Vue文件中文乱码问题")
print("=" * 60)
print(f"扫描目录: {target_dir}")
print()
# 执行修复
fixed, skipped, errors = scan_and_fix_directory(target_dir)
# 输出统计
print()
print("=" * 60)
print("修复完成统计")
print("=" * 60)
print(f"已修复文件数: {len(fixed)}")
print(f"跳过文件数: {len(skipped)}")
print(f"错误文件数: {len(errors)}")
print()
if fixed:
print("已修复的文件:")
for f in fixed[:10]: # 只显示前10个
print(f" - {f}")
if len(fixed) > 10:
print(f" ... 还有 {len(fixed) - 10} 个文件")
if errors:
print("\n错误文件:")
for f, msg in errors:
print(f" - {f}: {msg}")
print("\n建议:")
print("1. 重新编译项目: npm run dev:mp-weixin")
print("2. 在微信开发者工具中验证修复效果")
print("3. 检查页面显示是否正常")