本文**
原來的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選單下面。對於大型專案,很多新類都是從公共基類繼承的,以前每次都要到專案的類列表裡找半天,現在你可以把...