|
|
|
|
|
#!/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("修复完成!")
|