Delphi XE 的一些新函数

    技术2022-05-20  59

    MultiByteToWideChar

     procedure TWideCharStrList.AddString(const S: string);  var    Size, D: Integer;  begin    Size := SizeOf(S);    D := (Size + 1) * SizeOf(WideChar);    FList[FUsed] := AllocMem(D);    MultiByteToWideChar(0, 0, PChar(S), Size, FList[FUsed], D);   Inc(FUsed);  end;

     


    StrNew

     

    procedure TWideCharStrList.AddString(const S: string); var    L, D: Integer; begin    FList[FUsed] := StrNew(PWideChar(S));    Inc(FUsed);  end;

     


    SysUtils.AppendStr

     

    这种方法只能使用AnsiString类型,而不是UnicodeString。

      AppendStr(String1, String2);

    即下面的代码:

     String1 := String1 + String2;

     


    GetProcAddress

     

    当你调用GetProcAddress应该总是使用PAnsiChar(SDK中是没有后缀“W”的功能)。例如:

     procedure CallLibraryProc(const LibraryName, ProcName: string);  var    Handle: THandle;    RegisterProc: function: HResult stdcall;  begin    Handle := LoadOleControlLibrary(LibraryName, True);    @RegisterProc := GetProcAddress(Handle, PAnsiChar(AnsiString(ProcName)));  end;

     


    StringElementSize

    返回该字符串元素("代码点")的大小。考虑下面的代码:

    procedure TForm88.Button3Click(Sender: TObject); var A: AnsiString; U: UnicodeString; begin A := 'This is an AnsiString'; Memo1.Lines.Add('The ElementSize for an AnsiString is: ' + IntToStr(StringElementSize(A))); U := 'This is a UnicodeString'; Memo1.Lines.Add('The ElementSize for an UnicodeString is: ' + IntToStr(StringElementSize(U))); end;

    在这段代码的执行结果如下:

    The ElementSize for an AnsiString is: 1 The ElementSize for an UnicodeString is: 2

     


    StringCodePage 返回字符串值适当的代码页。

     

    考虑下面的代码: procedure TForm88.Button2Click(Sender: TObject); type // The code page for ANSI-Cyrillic is 1251 CyrillicString = type AnsiString(1251); var A: AnsiString; U: UnicodeString; U8: UTF8String; C: CyrillicString; begin A := 'This is an AnsiString'; Memo1.Lines.Add('AnsiString Codepage: ' + IntToStr(StringCodePage(A))); U := 'This is a UnicodeString'; Memo1.Lines.Add('UnicodeString Codepage: ' + IntToStr(StringCodePage(U))); U8 := 'This is a UTF8string'; Memo1.Lines.Add('UTF8string Codepage: ' + IntToStr(StringCodePage(U8))); C := 'This is a CyrillicString'; Memo1.Lines.Add('CyrillicString Codepage: ' + IntToStr(StringCodePage(C))); end;

    在这段代码的执行结果如下:

    The Codepage for an AnsiString is: 1252 The Codepage for an UnicodeString is: 1200 The Codepage for an UTF8string is: 65001 The Codepage for an CyrillicString is: 1251

     


    有几个程序来从一个代码页转换到另一个字符串。它们是:

     

    UnicodeStringToUCS4String UCS4StringToUnicodeString UnicodeToUtf8 Utf8ToUnicode

     


    RawByteString ,这是一个不与任何字符集关联的字符串:

    RawByteString = type AnsiString($FFFF);

    RawByteString类型变量需要使用尽可能少,因为这会导致数据丢失。让我们来看看为什么。

    通常,字符串类型支持的任务。

    例如:

    MyUnicodeString := MyAnsiString;

    将如预期般运作 - AnsiString类型的的内容将被放置在UnicodeString。编译器做所有的工作转变,如果可能的话。

    然而,有些变化可能导致数据丢失,例如,你可以分配一个UnicodeString类型的变量AnsiString类型,但如果UnicodeString包含非当前的ANSI所包括的字符,这些字符转换时将会丢失。考虑下面的代码:

    procedure TForm88.Button4Click(Sender: TObject); var U: UnicodeString; A: AnsiString; begin U := 'This is a UnicodeString'; A := U; Memo1.Lines.Add(A); U := 'Добро пожаловать в мир Юникода с использованием Дельфи 2009!!'; A := U; Memo1.Lines.Add(A); end;

    如果操作系统是活动代码页1252运行此代码后,显示如下:

    This is a UnicodeString ????? ?????????? ? ??? ??????? ? ?????????????? ?????? 2009!!

    正如您可以看到从该西里尔字符不是在Windows - 1252包括事实上,信息丢失,当您指定的UnicodeString AnsiString类型线。其结果是不可理解的文字的UnicodeString包含字符代码页中没有表示的以AnsiString类型,所以这些字符流失,用问号代替。


     


    最新回复(0)