如何在 VB6 应用程序中处理 DLL 错误消息的 encoding/localization?
How the encoding/localization of a DLL error message is handled in a VB6 application?
(更新: 这个问题在更好地理解发生了什么之后得到更新,我删除了嘈杂的错误部分。)
这段代码属于COM DLL。对于上下文,它包含一个在经典 ASP 页面中创建和处理的 ActiveX 对象。
Public Function getHttpResponse(url As String)
Dim request As New WinHttpRequest
On Error GoTo errGetHttpResponse
request.Open "HEAD", url
request.Send
getHttpResponse = request.Status
Exit Function
errGetHttpResponse:
getHttpResponse = Err.Description
End Function
Err.Description
字符串本地化和编码似乎依赖于 运行ning 环境。对于错误 80072EE5
,我得到 Err.Description
(从加载 DLL 的可执行文件的 GUI 检索):
- 机器 1,Windows 2008 SP2 32 位,法语:
L'URL n'est pas valide
- 机器 2,Windows 2012 R2 标准 64 位,法语:
L’URL n’est pas valide
,hexdump 给出:
值得注意的是撇号不一样。
调用和显示 ActiveX 输出的 ASP 页面可以这样简化:
Session.LCID=1036 ' French identifier (global.asa file)
Dim o : Set o = CreateObject("TheDLL.TheObject")
Response.Write o.getHttpResponse(anInvalidUrl)
虽然如果 运行 从机器 1 中它可以正确呈现,但从机器 2 中撇号被隐藏(在 Firefox 上查看源代码显示 00 92
方形字符)。机器 2 生成的 HTML 转载如下:
00000000 4c 92 55 52 4c 20 6e 92 65 73 74 20 70 61 73 20 |L.URL n.est pas |
00000010 76 61 6c 69 64 65 |valide
撇号被编码为 0x92
,这是 RIGHT SINGLE QUOTATION MARK 在 ISO-8859-1.
中的编码
如何解释差异?并且可以选择是否有一种方法可以设置独立于平台的输出?
(是的,这是一个即将消亡的遗留代码。)
在评论区与 Remy Lebeau 和 GSerg 进行了深入讨论后,以下是理解差异的关键:
- VB6 以 UTF-16 格式处理字符串,但它们的输出方式取决于上下文
- 本地化
Response.Charset
and Session.Codepage
for ASP pages, or default values 如果没有指定
- (各种 IO/GUI 机制)
- 错误消息可能因实现而异(这可以解释为什么撇号从
L'URL
更改为 L’URL
)
(更新: 这个问题在更好地理解发生了什么之后得到更新,我删除了嘈杂的错误部分。)
这段代码属于COM DLL。对于上下文,它包含一个在经典 ASP 页面中创建和处理的 ActiveX 对象。
Public Function getHttpResponse(url As String)
Dim request As New WinHttpRequest
On Error GoTo errGetHttpResponse
request.Open "HEAD", url
request.Send
getHttpResponse = request.Status
Exit Function
errGetHttpResponse:
getHttpResponse = Err.Description
End Function
Err.Description
字符串本地化和编码似乎依赖于 运行ning 环境。对于错误 80072EE5
,我得到 Err.Description
(从加载 DLL 的可执行文件的 GUI 检索):
- 机器 1,Windows 2008 SP2 32 位,法语:
L'URL n'est pas valide
- 机器 2,Windows 2012 R2 标准 64 位,法语:
L’URL n’est pas valide
,hexdump 给出:
值得注意的是撇号不一样。
调用和显示 ActiveX 输出的 ASP 页面可以这样简化:
Session.LCID=1036 ' French identifier (global.asa file)
Dim o : Set o = CreateObject("TheDLL.TheObject")
Response.Write o.getHttpResponse(anInvalidUrl)
虽然如果 运行 从机器 1 中它可以正确呈现,但从机器 2 中撇号被隐藏(在 Firefox 上查看源代码显示 00 92
方形字符)。机器 2 生成的 HTML 转载如下:
00000000 4c 92 55 52 4c 20 6e 92 65 73 74 20 70 61 73 20 |L.URL n.est pas |
00000010 76 61 6c 69 64 65 |valide
撇号被编码为 0x92
,这是 RIGHT SINGLE QUOTATION MARK 在 ISO-8859-1.
如何解释差异?并且可以选择是否有一种方法可以设置独立于平台的输出?
(是的,这是一个即将消亡的遗留代码。)
在评论区与 Remy Lebeau 和 GSerg 进行了深入讨论后,以下是理解差异的关键:
- VB6 以 UTF-16 格式处理字符串,但它们的输出方式取决于上下文
- 本地化
Response.Charset
andSession.Codepage
for ASP pages, or default values 如果没有指定- (各种 IO/GUI 机制)
- 错误消息可能因实现而异(这可以解释为什么撇号从
L'URL
更改为L’URL
)