Использование концепций из примера кода, предоставленного Microsoft для загрузки содержимого HTML в IWebBrowser из IStream с использованием IPersistStreamInit * веб-браузера интерфейс:
псевдокод:
void LoadWebBrowserFromStream(IWebBrowser webBrowser, IStream stream)
{
IPersistStreamInit persist = webBrowser.Document as IPersistStreamInit;
persist.Load(stream);
}
Как можно указать кодировку html внутри IStream? IStream будет содержать серию байтов, но проблема в том, что представляют эти байты? Они могут, например, содержать байты, где:
- каждый байт представляет символ из текущей кодовой страницы Windows (например, 1252)
- каждый байт может представлять символ из набора символов ISO-8859-1
- байты могут представлять символы в кодировке UTF-8
- каждые 2 байта могут представлять символ с использованием кодировки UTF-16
В моем конкретном случае я предоставляю IWebBrowser IStream, который содержит серию двухбайтовых символов (UTF-16), но браузер (неправильно) считает, что кодировка UTF-8 действует. Это приводит к искаженным символам.
Обходной раствор
Хотя вопрос состоит в том, как задать кодировку, в моем конкретном случае только с кодировкой UTF-16 существует простой обходной путь. Добавление метки порядка байтов 0xFEFF (BOM) означает, что текст имеет кодировку UTF-16. то есть затем использует правильную кодировку и правильно показывает текст.
Конечно, это не сработало бы, если бы текст был закодирован, например, с помощью:
- UCS-2
- UCS-4
- ISO-10646-UCS-2 * +1039 *
- UNICODE-1-1-UTF-8
- UNICODE-2-0-UTF-16
- UNICODE-2-0-UTF-8
- US-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