Delphi 7升级到XE2的字符串问题

本文转自 http://blog.sina.com.cn/s/blog_53decb41010171je.html

    原来的Delphi中有两种字符串:AnsiString和WideString。默认的string即AnsiString。而在Delphi 2009中,新增加了一种UnicodeString。为什么不沿用之前的WideString呢?WideString其实是为了方便使用COM而产生的,就是BSTR。BSTR没有引用计数,效率较低。而UnicodeString才是AnsiString的真正unicode版本。于是,Delphi 2009就有了三种字符串类型:AnsiString、WideString、UnicodeString。默认的string即为UnicodeString。对应的相关类型包括:
    AnsiString    - PAnsiChar - TAnsiString?(这个可以有……这个真没有,JclAnsiStrings.pas是一个替代品)
    WideString    - PWideChar - TWideStrings(WideStrings.pas)
    UnicodeString - PWideChar - TStrings(Classes.pas)

    在实际应用中,一般应使用UnicodeString。在效率第一的场合,可以使用AnsiString处理Ansi文本。而WideString仅在使用COM的时候才需要,或者是为了向下兼容。

    几个字符串相关unit的作用

        StrUtils.pas      :UnicodeString的处理函数。
        AnsiStrings.pas   :AnsiString的处理函数。
        WideStrUtils.pas  :WideString的处理函数。
        WideStrings.pas   :TWideStringList的实现。
        Classes.pas       :TStringList的实现。
        JclAnsiStrings.pas:TJclAnsiStringList的实现。这个虽然是第三方库,但不得不提,谁让CodeGear好死赖活不肯加呢。

        Delphi 2009的VCL完全使用UnicodeString,彻底支持Unicode。TNT Unicode Controls终于完成了光辉的历史使命。VCL设计之初不支持Unicode情有可原,但多年以后,在国际化的大潮中,依然没有改变,就是重大失误了。13年的等待,黄花菜都凉了。不论如何,今日的Delphier,可以放心大胆的使用Unicode了。

        关于UTF8String。UTF8String在之前的版本中就是AnsiString,没有什么特殊功能。而在Delphi 2009中,UTF8String才是真正的UTF8。如果把一个AnsiString赋值给一个UTF8String,那么Delphi 2009会自动转换格式为UTF8String,这比以前可要方便多了。

        关于RawByteString。这个在某些场合有用。如果你有一个函数,接受AnsiString或者UTF8String,但不希望发生自动转换,那么可以通过重载,实现两个函数分别处理AnsiString和UTR8String。另一个选择就是使用RawByteString,那么不管传过来的是AnsiString还是UTF8String,RawByteString都会忠实的保持原样,不会做任何转换。


类型转换


{AnsiString与WideString互相转换函数}
function AnsiStringToWideString(Const s:AnsiString):WideString;
function WideStringToAnsiString(Const s:WideString):AnsiString;
{UTF8与WideString互相转换函数}
function UTF8StringToWideString(Const s:UTF8String):WideString;
function WideStringToUTF8String(Const s:WideString):UTF8String;
{UTF8与AnsiString互相转换函数}
function UTF8StringToAnsiString(Const s:UTF8String):AnsiString;
function AnsiStringToUTF8String(Const s:AnsiString):UTF8String;

 


{AnsiString与WideString互相转换函数}
function AnsiStringToWideString(Const s:AnsiString):WideString;
var
  iLen:Integer;
  sw  :WideString;
begin
  result := '';
  if Length(s)=0 then Exit;
  iLen := MultiByteToWideChar(CP_ACP,0,PAnsiChar(s),-1,nil,0);
  SetLength(sw,iLen-1);
  MultiByteToWideChar(CP_ACP,0,PAnsiChar(s),-1,PWideChar(sw),iLen);
  Result:=sw;
end;

function WideStringToAnsiString(Const s:WideString):AnsiString;
var
  iLen:Integer;
  sa  :AnsiString;
begin
  result := '';
  if Length(s)=0 then Exit;
  iLen:=WideCharToMultiByte(CP_ACP,0,PWideChar(s),-1,nil,0,nil,nil);
  SetLength(sa,iLen-1);
  WideCharToMultiByte(CP_ACP,0,PWideChar(s),-1,PAnsiChar(sa),iLen,nil,nil);
  Result:=sa;
end;

{UTF8与WideString互相转换函数}
function UTF8StringToWideString(Const s:UTF8String):WideString;
var
  iLen:Integer;
  sw  :WideString;
begin
  result := '';
  if Length(s)=0 then Exit;
  iLen := MultiByteToWideChar(CP_UTF8,0,PAnsiChar(s),-1,nil,0);
  SetLength(sw,iLen);
  MultiByteToWideChar(CP_UTF8,0,PAnsiChar(s),-1,PWideChar(sw),iLen);
  Result:=sw;
end;

function WideStringToUTF8String(Const s:WideString):UTF8String;
var
  iLen:Integer;
  su  :UTF8String;
begin
  result := '';
  if Length(s)=0 then Exit;
  iLen := WideCharToMultiByte(CP_UTF8,0,PWideChar(s),-1,nil,0,nil,nil);
  SetLength(su,iLen);
  WideCharToMultiByte(CP_UTF8,0,PWideChar(s),-1,PAnsiChar(su),iLen,nil,nil);
  Result:=su;
end;

{UTF8与AnsiString互相转换函数}
function UTF8StringToAnsiString(Const s:UTF8String):AnsiString;
begin
  result:=WideStringToAnsiString(UTF8StringToWideString(S));
end;

function AnsiStringToUTF8String(Const s:AnsiString):UTF8String;
begin
  Result:=WideStringToUTF8String(AnsiStringToWideString(s));
end;


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值