Blog. Just Blog

Как узнать кодировку текста

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как узнать кодировку текста
Как узнать кодировку текста

Для корректного отображения или передачи текстов надо знать, в какой кодировке этот текст записан. Есть инструменты для статистического анализа в виде внешних dll или библиотек на различных языках программирования. А я в этой статье расскажу, как можно решить подобную задачу с использованием системного интерфейса IMultiLanguage2. Насколько мне известно, этот интерфейс создавался для использования в браузере Internet Explorer, в том числе с целью определения кодировок web-страниц.

Как вы могли догадаться, поскольку планируется работа с COM, то первым делом понадобятся GUID'ы и описания интерфейсов.
  1. ; GUID {275C23E2-3747-11D0-9FEA-00AA003F8646}
  2. CLSID_CMultiLanguage \
  3.     dd 0275C23E2h
  4.     dw 03747h
  5.     dw 011D0h
  6.     db 09Fh, 0EAh, 000h, 0AAh, 000h, 03Fh, 086h, 046h
  7.  
  8. ; GUID {DCCFC164-2B38-11D2-B7EC-00C04F8F5D9A}
  9. IID_IMultiLanguage2 \
  10.     dd 0DCCFC164h
  11.     dw 02B38h
  12.     dw 011D2h
  13.     db 0B7h, 0ECh, 000h, 0C0h, 04Fh, 08Fh, 05Dh, 09Ah
  14.  
  15. ; IID_IMultiLanguage2 Interface
  16. struct IMultiLanguage2
  17.     ; IUnknown
  18.     QueryInterface             dd ?   ; 000h
  19.     AddRef                     dd ?   ; 004h
  20.     Release                    dd ?   ; 008h
  21.     ; IMultiLanguage2
  22.     GetNumberOfCodePageInfo    dd ?   ; 00Ch
  23.     GetCodePageInfo            dd ?   ; 010h
  24.     GetFamilyCodePage          dd ?   ; 014h
  25.     EnumCodePages              dd ?   ; 018h
  26.     GetCharsetInfo             dd ?   ; 01Ch
  27.     IsConvertible              dd ?   ; 020h
  28.     ConvertString              dd ?   ; 024h
  29.     ConvertStringToUnicode     dd ?   ; 028h
  30.     ConvertStringFromUnicode   dd ?   ; 02Ch
  31.     ConvertStringReset         dd ?   ; 030h
  32.     GetRfc1766FromLcid         dd ?   ; 034h
  33.     GetLcidFromRfc1766         dd ?