HoShiMin
6/27/2015 - 3:26 PM

Модуль для удобного перевода ANSI-строк в Unicode и обратно.

Модуль для удобного перевода ANSI-строк в Unicode и обратно.

unit CodepageAPI;

interface

// Константы для CodePage:
const
  CP_ACP                   = 0;             { default to ANSI code page }
  CP_OEMCP                 = 1;             { default to OEM  code page }
  CP_MACCP                 = 2;             { default to MAC  code page }
  CP_THREAD_ACP            = 3;             { current thread's ANSI code page }
  CP_SYMBOL                = 42;            { SYMBOL translations }
  CP_UTF7                  = 65000;         { UTF-7 translation }
  CP_UTF8                  = 65001;         { UTF-8 translation }

// Unicode в ANSI и обратно:
function WideToAnsi(const WideString: WideString; CodePage: Word = CP_ACP): AnsiString;
function AnsiToWide(const AnsiString: AnsiString; CodePage: Word = CP_ACP): WideString;

// OEM в ANSI и обратно:
function StrOemToAnsi(const S: AnsiString): AnsiString;
function StrAnsiToOem(const S: AnsiString): AnsiString;
function ConvertToAnsi(OEM: PAnsiChar): PAnsiChar;
function ConvertToOEM(Ansi: PAnsiChar): PAnsiChar;

implementation

uses
  Windows;

function WideToAnsi(const WideString: WideString; CodePage: Word = CP_ACP): AnsiString;
var
  L: Integer;
begin
  if WideString = '' then
    Result := ''
  else
  begin
    L := WideCharToMultiByte(
                              CodePage,
                              WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
                              @WideString[1],
                              -1,
                              nil,
                              0,
                              nil,
                              nil
                            );

    SetLength(Result, L - 1);

    if L > 1 then
      WideCharToMultiByte(
                           CodePage,
                           WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
                           @WideString[1],
                           -1,
                           @Result[1],
                           L - 1,
                           nil,
                           nil
                         );
  end;
end;


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


function AnsiToWide(const AnsiString: AnsiString; CodePage: Word = CP_ACP): WideString;
var
  L: Integer;
begin
  if AnsiString = '' then
    Result := ''
  else
  begin
    L := MultiByteToWideChar(
                              CodePage,
                              MB_PRECOMPOSED,
                              PAnsiChar(@AnsiString[1]),
                              -1,
                              nil,
                              0
                            );

    SetLength(Result, L - 1);

    if L > 1 then
      MultiByteToWideChar(
                           CodePage,
                           MB_PRECOMPOSED,
                           PAnsiChar(@AnsiString[1]),
                           -1,
                           PWideChar(@Result[1]),
                           L - 1
                         );
  end;
end;


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


function StrOemToAnsi(const S: AnsiString): AnsiString;
begin
  if Length(S) = 0 then Result := ''
  else
    begin
      SetLength(Result, Length(S));
      OemToAnsiBuff(@S[1], @Result[1], Length(S));
    end;
end;


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


function StrAnsiToOem(const S: AnsiString): AnsiString;
begin
  if Length(S) = 0 then Result := ''
  else
    begin
      SetLength(Result, Length(S));
      AnsiToOemBuff(@S[1], @Result[1], Length(S));
    end;
end;


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


function ConvertToAnsi(OEM: PAnsiChar): PAnsiChar;
begin
  OemToAnsi(OEM, OEM);
  Result := OEM;
end;


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


function ConvertToOEM(Ansi: PAnsiChar): PAnsiChar;
begin
  AnsiToOem(Ansi, Ansi);
  Result := Ansi;
end;

end.