问题描述
(更新:这个问题在更好地理解发生了什么之后得到更新,我删除了嘈杂的错误部分。)
这段代码属于 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
字符串本地化和编码似乎依赖于运行环境。对于错误 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
,这是在 ISO-8859-1 中编码的 RIGHT SINGLE QUOTATION MARK。
差异如何解释?是否有办法设置与平台无关的输出?
解决方法
在评论部分与 Remy Lebeau 和 GSerg 进行了深入讨论后,以下是理解差异的关键:
- 字符串由 VB6 以 UTF-16 处理,但它们的输出方式取决于上下文
- 本地化
-
Response.Charset
和Session.Codepage
用于 ASP 页面,如果未指定,则为 default values - (各种 IO/GUI 机制)
- 错误消息可能因实现而异(这可以解释为什么撇号从
L'URL
更改为L’URL
)