一个 UTF-8 字符转换单元

                            {$J+,Z4}
unit UTF8;
{$IFDEF CONDITIONALEXPRESSIONS} {$WARN SYMBOL_PLATFORM OFF} {$ENDIF}

{------------------------------------------------------------------------------}
{                                                                              }
{          UTF8 utilities - especially for versions prior to Delphi 6          }
{                                                                              }
{                                 This code is                                 }
{                 Copyright (C) 2003 by Michael in der Wiesche                 }
{                                                                              }
{------------------------------------------------------------------------------}

 Secure memory management prevents passphrases from being swapped to disk
// Using secure memory within Delphi causes crashes, so it is disabled when debugging
// IsDebuggerPresent isn't available on Windows 95 - but neither is PGP 8.X - so we can use it ...

interface

type UTF8String = type String;

var AnsiToUtf8PChar: procedure(const Ansi, Utf8: PChar; var Len: Cardinal); stdcall;
var Utf8ToAnsiPChar: procedure(const Utf8, Ansi: PChar; var Len: Cardinal); stdcall;

function AnsiToUtf8(const S: String): UTF8String;
function Utf8ToAnsi(const S: UTF8String): String;
function Utf8OrAnsi(const S: UTF8String): String;

const MaxUTF8Length = 256*6;

implementation

uses Windows, SysUtils, pgpBase;

var SecureMemoryMgr: procedure; stdcall;
var DefaultMemoryMgr: procedure; stdcall;
var IsSecureMemoryMgr: function: Longbool; stdcall;

function AnsiToUtf8(const S: String): UTF8String;
var
  Len: Cardinal;
begin
  Len:=succ(Length(S) shl 2);
  SetLength(Result, Len);
  AnsiToUtf8PChar(PChar(S), PChar(Result), Len);
  SetLength(Result, Len);
end;

function Utf8ToAnsi(const S: UTF8String): String;
var
  Len: Cardinal;
begin
  Len:=succ(Length(S));
  SetLength(Result, Len);
  Utf8ToAnsiPChar(PChar(S), PChar(Result), Len);
  SetLength(Result, Len);
end;

function Utf8OrAnsi(const S: UTF8String): String;
begin
  Result:=Utf8ToAnsi(S);
  if Result='' then Result:=S;
end;

function Debugging: Longbool;
var
  IsDebuggerPresent: function: Bool; stdcall;
begin
  IsDebuggerPresent:=GetProcAddress(GetModuleHandle(Kernel32), 'IsDebuggerPresent');
  Result:=IsDebuggerPresent;
end;

function UsingSecMemIsSafe: Longbool;
begin
  Result:=(PGP8X and not Debugging and (pos('delphi32.exe', LowerCase(ParamStr(0)))=0));
end;

initialization
  if hUTF8Lib<>0 then begin
    AnsiToUtf8PChar:=GetProcAddress(hUTF8Lib, ptr(1));
    Utf8ToAnsiPChar:=GetProcAddress(hUTF8Lib, ptr(2));
    SecureMemoryMgr:=GetProcAddress(hUTF8Lib, ptr(3));
    DefaultMemoryMgr:=GetProcAddress(hUTF8Lib, ptr(4));
    IsSecureMemoryMgr:=GetProcAddress(hUTF8Lib, ptr(5));
    if UsingSecMemIsSafe then SecureMemoryMgr;
  end;

finalization
  if (hUTF8Lib<>0) and IsSecureMemoryMgr then DefaultMemoryMgr;

end.

                                

查看回复