Delphi 7公升級到XE2的字串問題

2021-06-22 14:23:42 字數 3701 閱讀 8375

本文** 

原來的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,這比以前可要方便多了。

型別轉換

function ansistringtowidestring(const s:ansistring):widestring;

function widestringtoansistring(const s:widestring):ansistring;

function utf8stringtowidestring(const s:utf8string):widestring;

function widestringtoutf8string(const s:widestring):utf8string;

function utf8stringtoansistring(const s:utf8string):ansistring;

function ansistringtoutf8string(const s:ansistring):utf8string;

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;

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;

function utf8stringtoansistring(const s:utf8string):ansistring;

begin

result:=widestringtoansistring(utf8stringtowidestring(s));

end;

function ansistringtoutf8string(const s:ansistring):utf8string;

begin

result:=widestringtoutf8string(ansistringtowidestring(s));

end;

從Delphi 7公升級到Delphi XE

delphi 7和xe中間有好幾個版本號,可都不太流行,一是由於delphi有些邊緣化,二是7在xp環境下是近乎完美的版本號。市場上關於delphi的書越來越少,提供從7公升級到xe介紹的資料差點兒沒用。這裡我試著列舉一下7和xe的差異和注意事項,給須要公升級的朋友一些線索。1.7和xe是能夠共存的...

從Delphi 7公升級到Delphi XE

delphi 7和xe中間有好幾個版本號,可都不太流行,一是由於delphi有些邊緣化,二是7在xp環境下是近乎完美的版本號。市場上關於delphi的書越來越少,提供從7公升級到xe介紹的資料差點兒沒用。這裡我試著列舉一下7和xe的差異和注意事項,給須要公升級的朋友一些線索。1.7和xe是能夠共存的...

從Delphi 7公升級到Delphi XE 2

對比於delphi 7,xe在很多細節方面做了改進,當然有些是在7和xe之間的版本中實現的,這裡不作計較。1.new選單的改進 new選單下面有個customize功能,可以定製哪些專案顯示在new選單下面。對於大型專案,很多新類都是從公共基類繼承的,以前每次都要到專案的類列表裡找半天,現在你可以把...