#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 修复 complete_mall_database.sql 中的 UTF-8 替换字符乱码 原始文件中大量中文字符被替换为 \xef\xbf\xbd (U+FFFD) """ import os import os ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..")) SRC = os.path.join(ROOT, "医疗-consumer", "mall_sql", "schemas", "complete_mall_database.sql") DST = os.path.join(ROOT, "医疗-consumer", "mall_sql", "schemas", "complete_mall_database_fixed.sql") DOC = os.path.join(ROOT, "医疗-consumer", "docs", "数据库对接文档.md") # 读取原始文件(bytes) with open(SRC, "rb") as f: raw = f.read() # 先把替换字符替换成一个临时标记,便于后续处理 marker = b"{{GARBLED}}" raw = raw.replace(b"\xef\xbf\xbd", marker) # 解码为字符串(此时已无替换字符) text = raw.decode("utf-8") # 批量替换:根据上下文推断正确字符 replacements = [ # 模块标题 / 注释 ("数据库设{{GARBLED}}", "数据库设计"), ("复用{{GARBLED}} ak_users", "复用主表 ak_users"), ("包含: 表结构、索引、触发器、RLS策略、视图、函{{GARBLED}}", "包含: 表结构、索引、触发器、RLS策略、视图、函数"), ("基础配置和扩{{GARBLED}}", "基础配置和扩展"), ("启用必要的扩{{GARBLED}}", "启用必要的扩展"), ("用户扩展{{GARBLED}}", "用户扩展表"), ("商城用户扩展信息{{GARBLED}}", "商城用户扩展信息表"), ("营业执照{{GARBLED}}", "营业执照号"), ("认证状{{GARBLED}}", "认证状态"), ("未认{{GARBLED}}", "未认证"), ("已认{{GARBLED}}", "已认证"), ("用户地址{{GARBLED}}", "用户地址表"), ("商品管理{{GARBLED}}", "商品管理模块"), ("商品分类{{GARBLED}}", "商品分类表"), ("品牌{{GARBLED}}", "品牌表"), ("商品{{GARBLED}}", "商品表"), ("基础属{{GARBLED}}", "基础属性"), ("状{{GARBLED}}", "状态"), ("商品SKU{{GARBLED}}", "商品SKU表"), ("商品规格{{GARBLED}}", "商品规格表"), ("规格值数{{GARBLED}}", "规格值数组"), ("店铺管理{{GARBLED}}", "店铺管理模块"), ("店铺信息{{GARBLED}}", "店铺信息表"), ("订单管理{{GARBLED}}", "订单管理模块"), ("订单{{GARBLED}}", "订单表"), ("总金{{GARBLED}}", "总金额"), ("状态信{{GARBLED}}", "状态信息"), ("待付{{GARBLED}}", "待付款"), ("待发{{GARBLED}}", "待发货"), ("待收{{GARBLED}}", "待收货"), ("已完{{GARBLED}}", "已完成"), ("已取{{GARBLED}}", "已取消"), ("退款中 7:已退{{GARBLED}}", "退款中 7:已退款"), ("订单商品{{GARBLED}}", "订单商品表"), ("营销管理{{GARBLED}}", "营销管理模块"), ("NULL表示平台{{GARBLED}}", "NULL表示平台券"), ("满减{{GARBLED}}", "满减券"), ("折扣{{GARBLED}}", "折扣券"), ("百分{{GARBLED}}", "百分比"), ("优惠{{GARBLED}}", "优惠值"), ("最低订单金{{GARBLED}}", "最低订单金额"), ("最大优惠金{{GARBLED}}", "最大优惠金额"), ("总发放数{{GARBLED}}", "总发放数量"), ("每用户限领数{{GARBLED}}", "每用户限领数量"), ("使用次数限{{GARBLED}}", "使用次数限制"), ("已结{{GARBLED}}", "已结束"), ("未使{{GARBLED}}", "未使用"), ("已使{{GARBLED}}", "已使用"), ("已过{{GARBLED}}", "已过期"), ("配送员信息{{GARBLED}}", "配送员信息表"), ("电动{{GARBLED}}", "电动车"), ("摩托{{GARBLED}}", "摩托车"), ("配送距{{GARBLED}}", "配送距离"), ("预计配送时{{GARBLED}}", "预计配送时间"), ("取货{{GARBLED}}", "取货码"), ("评价管理{{GARBLED}}", "评价管理模块"), ("商品评价{{GARBLED}}", "商品评价表"), ("已删{{GARBLED}}", "已删除"), ("已隐{{GARBLED}}", "已隐藏"), ("用户行为{{GARBLED}}", "用户行为模块"), ("用户收藏{{GARBLED}}", "用户收藏表"), ("用户浏览历史{{GARBLED}}", "用户浏览历史表"), ("浏览时长({{GARBLED}}", "浏览时长(秒)"), ("搜索记录{{GARBLED}}", "搜索记录表"), ("系统配置{{GARBLED}}", "系统配置表"), ("地区{{GARBLED}}", "地区表"), ("用户扩展表索{{GARBLED}}", "用户扩展表索引"), ("地址表索{{GARBLED}}", "地址表索引"), ("商品表索{{GARBLED}}", "商品表索引"), ("SKU表索{{GARBLED}}", "SKU表索引"), ("订单表索{{GARBLED}}", "订单表索引"), ("订单商品表索{{GARBLED}}", "订单商品表索引"), ("收藏表索{{GARBLED}}", "收藏表索引"), ("触发器函{{GARBLED}}", "触发器函数"), ("自动更新 updated_at 字段的函{{GARBLED}}", "自动更新 updated_at 字段的函数"), ("为需要的表创{{GARBLED}}updated_at 触发{{GARBLED}}", "为需要的表创建 updated_at 触发器"), ("商品库存更新触发{{GARBLED}}", "商品库存更新触发器"), ("更新商品总库{{GARBLED}}", "更新商品总库存"), ("订单状态变更时的处{{GARBLED}}", "订单状态变更时的处理"), ("更新商品销{{GARBLED}}", "更新商品销量"), ("生成优惠券码的函{{GARBLED}}", "生成优惠券码的函数"), ("计算购物车总金{{GARBLED}}", "计算购物车总金额"), ("获取商品总库{{GARBLED}}", "获取商品总库存"), ("自己的数{{GARBLED}}", "自己的数据"), ("初始化数{{GARBLED}}", "初始化数据"), ("优惠券设{{GARBLED}}", "优惠券设置"), ("已创建索{{GARBLED}} 30+ 个索{{GARBLED}}", "已创建索引 30+ 个索引"), ("已创建函{{GARBLED}} 10+ 个函{{GARBLED}}", "已创建函数 10+ 个函数"), ("已创建视{{GARBLED}} 3 个视{{GARBLED}}", "已创建视图 3 个视图"), ] for old, new in replacements: text = text.replace(old, new) # 写入修复后的文件 with open(DST, "w", encoding="utf-8") as f: f.write(text) # 检查是否还有残留 remaining = text.count("{{GARBLED}}") print(f"修复完成,残留乱码标记: {remaining}") if remaining > 0: for i, line in enumerate(text.splitlines(), 1): if "{{GARBLED}}" in line: print(f" Line {i}: {line.strip()[:120]}")