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


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值