求解析IBM Lotus Notes旧专有格式OTG/ONM文件的方法
解析IBM Lotus Notes OTG/ONM文件消息体的解决方案
编码排查方向
- 不要局限于IBM437,优先尝试IBM850(西欧扩展ASCII)或Windows-1252,Lotus Notes早期版本对西欧字符常使用这两种编码。
- 检查已解析的头部字段:部分OTG文件会在头部存储
$Codepage类的编码标识,可直接以此作为解码依据。
处理富文本结构
OTG/ONM属于Lotus Notes富文本格式,乱码大概率是未处理富文本控制字符导致,而非单纯编码问题:
- 识别富文本标记:你看到的
??Z这类乱码是富文本的结构控制字节(多为0x00-0x1F范围),需跳过这些结构段,只提取纯文本数据块。 - 提取规则参考:Lotus Notes富文本以
0x1A作为块分隔符,文本块通常以0x00开头,后跟长度字段,再是实际文本内容。 - 过滤非打印字符:保留ASCII 32-126范围内的字符,以及换行、制表符等合法格式字符,再进行编码转换。
工具辅助验证
- 用Lotus Notes客户端打开原始EMX中的OTG文件,导出为纯文本,对比你的解析结果,区分控制字符与编码问题。
- 用
hexdump(Linux)或HxD(Windows)查看OTG文件十六进制内容:若乱码字节在0x80-0xFF范围,优先试Windows-1252;若在0xC0-0xFF,尝试ISO-8859-1。
伪代码示例
# 读取OTG二进制数据 raw_data = open("target.otg", "rb").read() # 过滤控制字符,保留可打印文本及合法格式符 filtered_bytes = b"" for b in raw_data: if (32 <= b <= 126) or b in [9, 10, 13]: filtered_bytes += bytes([b]) # 多编码尝试解码 candidate_encodings = ["ibm850", "windows-1252", "iso-8859-1", "ibm437"] for enc in candidate_encodings: try: decoded_text = filtered_bytes.decode(enc) print(f"[{enc}] 解码片段:\n{decoded_text[:600]}...") except UnicodeDecodeError: continue
内容的提问来源于stack exchange,提问作者JMoneyPlzSendHelp
相关产品推荐
相关产品推荐

