Карта сайта 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/

Код, который вы предоставили, - это модуль для преобразования текста из одного кодировочного пространства в другое с помощью библиотеки Microsoft Multi-Language Library (MLang). Модуль uCodePageConverter предлагает интерфейс для создания экземпляра COM-объекта IMLangConvertCharset, который может использоваться для преобразования текста между различными кодировочными пространствами.

Код определяет несколько констант для общих кодировочных пространств, таких как тайский, японский, китайский (КНР и Тайвань), корейский и Юникод. Он также определяет функции для инициализации преобразования, получения исходного и целевого кодировочных пространств, а также выполнения самого преобразования.

Чтобы использовать этот модуль, вам нужно создать форму с контролем memo и кнопкой. Затем вы добавляете следующий код в обработчик события OnClick для кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var
  Conv: IMLangConvertCharset;
  Source: PWChar;
  Dest: PChar;
  SourceSize, DestSize: UINT;
begin
   // подключение к MS multi-language lib
  Conv := CoMLangConvertCharset.Create;

   // инициализация преобразования из Юникода в японский
  Conv.Initialize(CODEPAGE_Unicode, CODEPAGE_Japanese, MLCONVCHARF_ENTITIZE);

   // загрузка источника (из memo)
  Source := PWChar(WideString(Memo1.Text));
  SourceSize := Succ(Length(Memo1.Text));

   // подготовка целевого
  DestSize := 0;

   // подсчет размера, необходимого для целевого
  Conv.DoConversionFromUnicode(Source, @SourceSize, nil, @DestSize);

   // резервирование памяти
  GetMem(Dest, DestSize);
  try
     // преобразование
    Conv.DoConversionFromUnicode(Source, @SourceSize, Dest, @DestSize);

     // отображение
    Memo1.Text := Dest;
  finally
     // освобождение памяти
    FreeMem(Dest);
  end;
end;

В этом коде создается экземпляр COM-объекта IMLangConvertCharset, инициализируется для преобразования из Юникода в японский, загружается источник текста из контрола memo, а затем выполняется преобразование с помощью метода DoConversionFromUnicode. Результат преобразованного текста отображается в том же контроле memo.

Обратите внимание, что этот код предполагает, что оба исходное и целевое кодировочные пространства поддерживаются на компьютере, где выполняется преобразование. Кроме того, процесс преобразования может занять некоторое время для больших объемов текста, поэтому вам может потребоваться реализация более эффективного подхода, если вопросы производительности являются важными.

Конвертирование кодовой страницы: статья предлагает утилиту для конвертации текста из одной кодовой страницы в другую, используя библиотеку mlang.dll MS Internet Explorer 4 и более новых систем.


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

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:04:45/0.0044801235198975/0