Delphi XE 的一些新函数

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类型,所以这些字符流失,用问号代替。


联系电话:
020-00000000
联系电话:
020-00000000
联系电话:
020-12345678