Як конвертувати кодову сторінку

Delphi , Синтаксис , Кодування

Як конвертувати кодову сторінку?

Всі системи (Win 95 + і WinNT4 +) з MS Internet Explorer 4 і нові мають бібліотеки mlang.dll в Winnt System32. Зазвичай ви можете сказати, Delphi просто імпортувати ці COM бібліотеки. Це є одне але, Delphi це не зробили. Я почав конвертувати "Most Wanted" інтерфейс для себе. Результати я уявляю вам тут.

Спочатку я даю вам код перетворення блоку, що дозволяє просто конвертувати будь-який текст з коду інтерпретації сторінки в іншу. Далі код та приклад того, як його використовувати.

type tagMLCONVCHARF = DWORD;

const MLCONVCHARF_AUTODETECT: tagMLCONVCHARF = 1; MLCONVCHARF_ENTITIZE: tagMLCONVCHARF = 2;

type tagCODEPAGE = UINT;

const CODEPAGE_Thai: tagCODEPAGE = 0874; CODEPAGE_Japanese: tagCODEPAGE = 0932; CODEPAGE_Chinese_PRC: tagCODEPAGE = 0936; CODEPAGE_Korean: tagCODEPAGE = 0949; CODEPAGE_Chinese_Taiwan: tagCODEPAGE = 0950; CODEPAGE_UniCode: tagCODEPAGE = 1200; CODEPAGE_Windows_31_EastEurope: tagCODEPAGE = 1250; CODEPAGE_Windows_31_Cyrillic: tagCODEPAGE = 1251; CODEPAGE_Windows_31_Latin1: tagCODEPAGE = 1252; CODEPAGE_Windows_31_Greek: tagCODEPAGE = 1253; CODEPAGE_Windows_31_Turkish: tagCODEPAGE = 1254; CODEPAGE_Hebrew: tagCODEPAGE = 1255; CODEPAGE_Arabic: tagCODEPAGE = 1256; CODEPAGE_Baltic: tagCODEPAGE = 1257;

type IMLangConvertCharset = interface [''] function Initialize( uiSrcCodePage: tagCODEPAGE; uiDstCodePage: tagCODEPAGE; dwProperty: tagMLCONVCHARF ): HResult; stdcall; функція GetSourceCodePage( out puiSrcCodePage: tagCODEPAGE ): HResult; stdcall; functionGetDestinationCodePage( out puiDstCodePage: tagCODEPAGE ): HResult; stdcall; функція GetProperty(out pdwProperty: tagMLCONVCHARF): HResult; stdcall; функція DoConversion( pSrcStr: PChar; pcSrcSize: PUINT; pDstStr: PChar; pcDstSize: PUINT ): HResult; stdcall; функція DoConversionToUnicode( pSrcStr: PChar; pcSrcSize: PUINT; pDstStr: PWChar; pcDstSize: PUINT ): HResult; stdcall; функція DoConversionFromUnicode( pSrcStr: PWChar; pcSrcSize: PUINT; pDstStr: PChar; pcDstSize: PUINT ): HResult; stdcall; кінець;

CoMLangConvertCharset = class функція класу Create: IMLangConvertCharset; функція класу CreateRemote(const MachineName: рядок): IMLangConvertCharset; кінець;

функція класу CoMLangConvertCharset.Create: IMLangConvertCharset; begin Result := CreateComObject(CLASS_MLangConvertCharset) as IMLangConvertCharset; кінець;

функція класу CoMLangConvertCharset.CreateRemote( const MachineName: string ): IMLangConvertCharset; begin Result := CreateRemoteComObject( MachineName, CLASS_MLangConvertCharset ) as IMLangConvertCharset; кінець;

Як ви бачите, я зробив переклад лише одного з багатьох інтерфейсів, однак він є найбільш ефективним (за даними Microsoft) і саме головне цього достатньо, щоб виконувати цю роботу. Далі я додав кілька констант, щоб спростити задачу пошуку найбільш важливих цінностей.

При використанні даного юнита ділової конвертації для будь-якої кодової сторінки ви не повинні забувати, що обидва коди сторінки (істочник і пункт призначення) повинні бути встановлені та підтримуватися на комп’ютері, для якого виконується переклад.

Щоб перевірити код, потрібно просто створити форму з пам'яткою та кнопками. Додайте наступний код кнопки на подію OnClick .(Не забудьте додати перетворення коду в пропозиції USES!)

код:
процедура TForm1.Button1Click(Відправник: TObject); var Conv: IMLangConvertCharset; Джерело: PWChar; Ціль: PChar; SourceSize, DestSize: UINT; begin // підключення до багатомовної бібліотеки MS Conv := CoMLangConvertCharset.Create; // ініціалізувати переклад UniCode японською Conv.Initialize(CODEPAGE_UniCode, CODEPAGE_Japanese, MLCONVCHARF_ENTITIZE); // завантажувати джерело (з пам'ятки) Джерело := PWChar(WideString(Memo1.Text)); SourceSize := Succ(Length(Memo1.Text)); // підготувати пункт призначення DestSize := 0; // дозволяє обчислити необхідний розмір Conv.DoConversionFromUnicode(Source, @SourceSize, nil, @DestSize); // резервувати пам'ять GetMem(Dest, DestSize); спробуйте // конвертуйте Conv.DoConversionFromUnicode(Source, @SourceSize, Dest, @DestSize); // показати Memo1.Text := Dest; нарешті // звільнити пам'ять FreeMem(Dest); кінець; кінець;
Взято з Delphi Knowledge Base: http://www.baltsoft.com/

СтаттяЯк конвертувати кодову сторінку? розділ Синтаксис кодування може бути корисним для розробників Delphi та FreePascal.

Коментарі і питання