使用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