IWebBrowser: Как указать кодировку при загрузке html из потока? - PullRequest
1 голос
/ 06 апреля 2010

Использование концепций из примера кода, предоставленного 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

1 Ответ

1 голос
/ 15 апреля 2010

Документ IE также поддерживает загрузку IPersistMoniker. IE использует URL-прозвища для загрузки. Вы можете заменить прозвище URL , созданное CreateURLMonikerEx , своим собственным прозвищем. Несколько подробностей о реализации URL-моникера можно найти здесь . Посмотрите, сможете ли вы получить IHTTPNegotiate из контекста привязки, когда вызывается ваша реализация BindToStroage.

...