Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Как конвертировать кодовую страницу?

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

Как конвертировать кодовую страницу?

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

  uCodePageConverter
Code:
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Unit Name : uCodePageConverter
* Autor     : Daniel Wischnewski
* Copyright : Copyright © 2002 by gate(n)etwork. All Right Reserved.
* Urheber   : Daniel Wischnewski
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
 
unit uCodePageConverter;
 
interface
 
uses
Windows;
 
const
IID_MLangConvertCharset: TGUID = '{D66D6F98-CDAA-11D0-B822-00C04FC9B31F}';
CLASS_MLangConvertCharset: TGUID = '{D66D6F99-CDAA-11D0-B822-00C04FC9B31F}';
 
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
   ['{D66D6F98-CDAA-11D0-B822-00C04FC9B31F}']
   function Initialize(
     uiSrcCodePage: tagCODEPAGE; uiDstCodePage: tagCODEPAGE;
     dwProperty: tagMLCONVCHARF
     ): HResult; stdcall;
   function GetSourceCodePage(
     out puiSrcCodePage: tagCODEPAGE
     ): HResult; stdcall;
   function GetDestinationCodePage(
     out puiDstCodePage: tagCODEPAGE
     ): HResult; stdcall;
   function GetProperty(out pdwProperty: tagMLCONVCHARF): HResult; stdcall;
   function DoConversion(
     pSrcStr: PChar; pcSrcSize: PUINT; pDstStr: PChar; pcDstSize: PUINT
     ): HResult; stdcall;
   function DoConversionToUnicode(
     pSrcStr: PChar; pcSrcSize: PUINT; pDstStr: PWChar; pcDstSize: PUINT
     ): HResult; stdcall;
   function DoConversionFromUnicode(
     pSrcStr: PWChar; pcSrcSize: PUINT; pDstStr: PChar; pcDstSize: PUINT
     ): HResult; stdcall;
end;
 
CoMLangConvertCharset = class
   class function Create: IMLangConvertCharset;
   class function CreateRemote(const MachineName: string): IMLangConvertCharset;
end;
 
implementation
 
uses
ComObj;
 
{ CoMLangConvertCharset }
 
class function CoMLangConvertCharset.Create: IMLangConvertCharset;
begin
Result := CreateComObject(CLASS_MLangConvertCharset) as IMLangConvertCharset;
end;
 
class function CoMLangConvertCharset.CreateRemote(
const MachineName: string
): IMLangConvertCharset;
begin
Result := CreateRemoteComObject(
   MachineName, CLASS_MLangConvertCharset
   ) as IMLangConvertCharset;
end;
 
end.
 
 

Как вы видите, я сделал перевод только одного из многих интерфейсов, однако эта является наиболее эффективным (по данным Microsoft) и самое главное этого достаточно, чтобы делать эту работу. Далее я добавил несколько констант, чтобы упростить задачу поиска наиболее важных ценностей.
 
При использовании данного юнита делая конвертациб для любой кодовой страницы вы не должны забывать, что оба кода страницы (источник и пункт назначения) должны быть установлены и поддерживаются на компьютере, для которых делается перевод.
 
Чтобы проверить код нужно просто создать форму с мемо и кнопки. Добавить следующий код кнопки на событие OnClick . (Не забудьте добавить код преобразования в предложении USES!)

 

Пример:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
Conv: IMLangConvertCharset;
Source: PWChar;
Dest: PChar;
SourceSize, DestSize: UINT;
begin
// connect to MS multi-language lib
Conv := CoMLangConvertCharset.Create;
// initialize UniCode Translation to Japanese
Conv.Initialize(CODEPAGE_UniCode, CODEPAGE_Japanese, MLCONVCHARF_ENTITIZE);
// load source (from memo)
Source := PWChar(WideString(Memo1.Text));
SourceSize := Succ(Length(Memo1.Text));
// prepare destination
DestSize := 0;
// lets calculate size needed
Conv.DoConversionFromUnicode(Source, @SourceSize, nil, @DestSize);
// reserve memory
GetMem(Dest, DestSize);
try
   // convert
   Conv.DoConversionFromUnicode(Source, @SourceSize, Dest, @DestSize);
   // show
   Memo1.Text := Dest;
finally
   // free memory
   FreeMem(Dest);
end;
end;
Взято с Delphi Knowledge Base: http://www.baltsoft.com/

Статья Как конвертировать кодовую страницу? раздела Синтаксис Кодировки может быть полезна для разработчиков на Delphi и FreePascal.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Кодировки ::


реклама

::


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Rambler's Top100
26.06.2017 06:34:06/0.020314931869507/0