1

使用Microsoft 提供的示例代码中的概念,使用 Web 浏览器的IPersistStreamInit接口将 HTML 内容从IStream加载到IWebBrowser :

伪代码:

void LoadWebBrowserFromStream(IWebBrowser webBrowser, IStream stream)
{
   IPersistStreamInit persist = webBrowser.Document as IPersistStreamInit;
   persist.Load(stream);
}

如何在 IStream 中指定 html 的编码?IStream 将包含一系列字节,但问题是这些字节代表什么?例如,它们可以包含以下字节:

  • 每个字节代表当前 Windows 代码页中的一个字符(例如 1252)
  • 每个字节可以代表 ISO-8859-1 字符集中的一个字符
  • 字节可以表示 UTF-8 编码的字符
  • 每 2 个字节可以代表一个字符,使用 UTF-16 编码

在我的特殊情况下,我为 IWebBrowser 提供了一个包含一系列双字节字符(UTF-16)的 IStream,但浏览器(错误地)认为 UTF-8 编码有效。这会导致乱码。

解决方法

虽然问题询问如何指定编码,但在我的特定情况下,仅使用 UTF-16 编码,有一个简单的解决方法。添加 0xFEFF 字节顺序标记 (BOM) 表示文本是 UTF-16 unicode。即然后使用正确的编码并正确显示文本。

当然,如果文本被编码,那将不起作用,例如:

  • UCS-2
  • UCS-4
  • ISO-10646-UCS-2
  • UNICODE-1-1-UTF-8
  • UNICODE-2-0-UTF-16
  • UNICODE-2-0-UTF-8
  • 美国ASCII
  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-3
  • ISO-8859-4
  • ISO-8859-5
  • ISO-8859-6
  • ISO-8859-7
  • ISO-8859-8
  • ISO-8859-9
  • WINDOWS-1250
  • WINDOWS-1251
  • WINDOWS-1252
  • WINDOWS-1253
  • WINDOWS-1254
  • WINDOWS-1255
  • WINDOWS-1256
  • WINDOWS-1257
  • WINDOWS-1258
4

1 回答 1

1

IE 的文档也支持 IPersistMoniker 加载。IE 使用URL monikers进行下载。您可以将CreateURLMonikerEx 创建的 url 名字对象替换为您自己的名字对象。可以在此处找到有关 URL moniker 实现的一些详细信息。在调用 BindToStroage 实现时,查看是否可以从绑定上下文中获取 IHTTPNegotiate。

于 2010-04-14T21:22:36.873 回答