255 lines
7.4 KiB
Python
255 lines
7.4 KiB
Python
|
|
# -*- 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. 检查页面显示是否正常")
|