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