VB6开发的COM DLL错误消息编码与本地化处理问题
问题原因
1. 不同系统返回撇号不一致的原因
这是Windows系统版本迭代中本地化字符串优化导致的差异:Windows 2008的法语错误消息模板使用的是标准直撇号(U+0027),而Windows 2012 R2对本地化文案做了排版优化,把错误消息里的撇号替换成了更符合法语排版规范的右弯单引号(U+2019),因此两个系统返回的错误描述字符串本身字符就不同。
2. 设备2出现乱码的原因
右弯单引号U+2019在Windows-1252(西欧语言常用的Windows默认编码)中的字节值是0x92,而经典ASP如果没有显式指定输出编码,浏览器会默认按ISO-8859-1解析内容。ISO-8859-1编码中0x92属于不可见控制字符,因此就会显示为方块占位符。而直撇号U+0027在Windows-1252和ISO-8859-1中的编码都是0x27,因此设备1不会出现乱码问题。
解决方案
因为是即将下线的遗留系统,推荐优先选择改造成本最低的方案:
方案1:COM层统一替换字符(最便捷)
直接修改DLL中的错误处理逻辑,把所有弯单引号统一替换为直撇号,不管系统返回什么格式都做归一化处理:
errGetHttpResponse: Dim errDesc errDesc = Err.Description ' 替换右弯单引号为标准直撇号 errDesc = Replace(errDesc, ChrW(&H2019), "'") getHttpResponse = errDesc End Function
方案2:ASP层处理编码+替换字符(不需要改DLL)
如果没有DLL的修改权限,可以直接修改ASP代码,显式指定输出编码,同时替换异常字符:
Session.LCID=1036 ' 明确指定输出编码为Windows-1252,和系统默认编码匹配 Response.CodePage = 1252 Response.Charset = "windows-1252" Dim o : Set o = CreateObject("TheDLL.TheObject") Dim res : res = o.getHttpResponse(anInvalidUrl) ' 替换异常的0x92字符为直撇号 res = Replace(res, Chr(&H92), "'") Response.Write res
方案3:自定义错误映射(完全不依赖系统)
如果要彻底规避系统版本、本地化带来的所有差异,可以直接根据错误码返回自定义的固定错误消息,完全忽略系统返回的Err.Description:
errGetHttpResponse: Select Case Err.Number Case &H80072EE5 ' 无效URL错误码 getHttpResponse = "L'URL n'est pas valide" Case &H80072EFD ' 连接失败错误码示例 getHttpResponse = "Impossible de se connecter au serveur" Case Else getHttpResponse = "Erreur inconnue : " & CStr(Err.Number) End Select
这个方案最稳定,输出完全不受运行环境影响。
内容的提问来源于stack exchange,提问作者Amessihel
相关产品推荐
相关产品推荐

