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