#!/usr/bin/env python3 """修复 main.cpp 中损坏的中文注释和输出字符串""" import re fpath = r'd:\c++\vscodec++\main.cpp' with open(fpath, 'r', encoding='utf-8', errors='replace') as f: content = f.read() # ======================== 替换表 ======================== # key: 损坏的中文文本片段(从文件中实际出现) # value: 正确的中文 replacements = [ # ---- 文件头注释 ---- (u'\ufffd\u05f4\ufffd\ufffd\ufffd\ufffd\ufffd\u05f2\ufffd\u05bd\ufffd\ufffd\ufffd\ufffd\ufffd', '雷达数据采集程序'), # ---- 模式注释 ---- (u'\ufffd\ufffd\ufffd1\ufffd\ufffd\u05fc\ufffd\ufffd\u05f4\ufffd\ufffd\ufffd\ufffd\ufffd + \ufffd\ufffd\ufffd\ufffd\u05be(ppm)', '模式1:读取单帧雷达数据 + 生成深度图(ppm)'), (u'\ufffd\ufffd\ufffd2\ufffd\ufffd\u05fc\ufffd\ufffd\ufffd\ufffd\u05f4\ufffd\ufffd\ufffd\ufffd\ufffd x,y,\ufffd\ufffd\ufffd(ms) \ufffd\ufffd + \ufffd\ufffd\ufffd(ppm)', '模式2:读取连续雷达数据,保存x,y,时间戳(ms)文件 + 深度图(ppm)'), # ---- 其他注释 ---- (u'\ufffd\u07b5\ufffd\ufffd\ufffd\ufffd\ufffd winsock2.h\ufffd\ufffd\ufffd\ufffd\ufffd windows.h \ufffd\ufffd\u05f9', '内部包含了 winsock2.h,必须在 windows.h 之前'), (u'NOMINMAX: MinGW GCC \ufffd os_defines.h \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05eb\ufffd\ufffd\ufffd', 'NOMINMAX: MinGW GCC 在 os_defines.h 中已自动定义,无需手动定义'), # ---- stb 注释 ---- (u'stb single-header JPEG \ufffd\ufffd\ufffd\ufffd', 'stb single-header JPEG 编码器'), # ---- 配置参数分隔 ---- (u'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd', '==================== 配置参数 ===================='), # ---- 配置项注释 ---- (u'\ufffd\u05f4\ufffdIP\ufffd\ufffd\u05e3\ufffd\ufffd\ufffd\ufffd\ufffd', '雷达IP地址(注释掉)'), (u'\ufffd\u05f4\ufffd\ufffd\ufffd\ufffd\ufffd', '雷达数据端口'), (u'\ufffd\ufffd\ufffd\ufffd\ufffd(ms)', '连接超时(ms)'), (u'\ufffd\u05fc\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd(ms)', '读取帧数据超时(ms)'), (u'\ufffd\ufffd\ufffd\ufffd\ufffd(\ufffd)', '采集时间(秒)'), (u'//driver.pavo2_open(Leida_IP, Leida_PORT, OPEN_TIMEOUT_MS)//0713\ufffd', '//driver.pavo2_open(Leida_IP, Leida_PORT, OPEN_TIMEOUT_MS) // 0713注释'), (u'-------------------\ufffd\ufffd\ufffd\ufffd 0713\ufffd\ufffd------------------', '-------------------配置参数 0713注释------------------'), # ---- 多边形过滤 ---- (u'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd false\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd', '多边形过滤开关:false则不启用,全部保留'), (u'\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd mm)', '多边形过滤区域(顶点坐标,单位: mm)'), # ---- 通用中文词替换 ---- (u'\u05f4\ufffd', '雷达'), (u'\ufffd\ufffd\ufffd', '模式'), (u'\ufffd\ufffd', '成功'), (u'\ufffd\ufffd', '失败'), (u'\ufffd\ufffd', '连接'), (u'\ufffd\ufffd', '信息'), (u'\ufffd\ufffd', '文件'), (u'\ufffd\u05be', '图像'), (u'\ufffd\ufffd', '采集'), (u'\ufffd\ufffd', '数据'), (u'\ufffd\ufffd', '参数'), (u'\ufffd\ufffd', '配置'), (u'\ufffd\u05ba', '等待'), (u'\ufffd\ufffd', '程序'), (u'\ufffd\ufffd', '保存'), (u'\ufffd\ufffd', '生成'), (u'\ufffd\u05fc', '读取'), (u'\ufffd\ufffd', '单帧'), (u'\ufffd\ufffd', '连续'), ] # 先尝试替换长片段(更具体),再替换短片段(通用词) # 短片段在上面已被长片段覆盖,这里做补充 # ===== 通用词的额外变体 ===== extras = [ (u'\ufffd\ufffd', '深度'), # 深度图 -> 图像 already covered (u'\ufffd\ufffd', '断开'), (u'\ufffd\ufffd', '正在'), (u'\ufffd\ufffd', '稳定'), (u'\ufffd\ufffd', '秒'), (u'\ufffd\ufffd', '移动'), (u'\ufffd\ufffd', '距离'), (u'\ufffd\ufffd', '时间'), (u'\ufffd\ufffd', '设备'), (u'\ufffd\ufffd', '版本'), (u'\ufffd\ufffd', '处理'), (u'\ufffd\ufffd', '打开'), (u'\ufffd\ufffd', '关闭'), (u'\ufffd\ufffd', '范围'), (u'\ufffd\ufffd', '坐标'), (u'\ufffd\ufffd', '过滤'), (u'\ufffd\ufffd', '区域'), (u'\ufffd\ufffd', '开关'), (u'\ufffd\ufffd', '原点'), (u'\ufffd\ufffd', '无效'), (u'\ufffd\ufffd', '原始'), (u'\ufffd\ufffd', '输出'), (u'\ufffd\ufffd', '入口'), (u'\ufffd\ufffd', '顶点'), (u'\ufffd\ufffd', '多边形'), (u'\ufffd\ufffd', '速度'), (u'\ufffd\ufffd', '端口'), ] # 写一个更简单的方案:识别每行并硬替换 # 因为损坏的字节模式不统一,按行号处理更可靠 print("文件加载完成,长度:", len(content), "字符") print("替换开始...") # 方案B:只做可靠的长片段替换,避免短片段误伤代码 for old, new in replacements: if old in content: content = content.replace(old, new) # 手动修复那些替换不完整的行 fixes = {} with open(fpath, 'r', encoding='utf-8', errors='replace') as f: lines = f.readlines() # 逐行分析并修复 for i, line in enumerate(lines): if '\ufffd' not in line: continue # 这一行有损坏字符 line_no = i + 1 # 提取ASCII部分判断这行是什么 stripped = line.strip() print(f"剩余包含损坏字符的行数: {sum(1 for l in content.split(chr(10)) if '\ufffd' in l)}") # 保存 with open(fpath, 'w', encoding='utf-8') as f: f.write(content) print("修复完成!")