Delphi 中的 AnsiString,、Utf8String、WideString


Delphi 中的 AnsiString,、Utf8String、WideString

1、AnsiString  

這是Pascal缺省的字符串類型,它由AnsiChar   字符組成,其長度沒有限制,同時與null結束的字符串相兼容,它的內存和ANSI編碼格式的TXT文件的內存一樣,AnsiString可能是全部都是ASCII字符,也可能包含中文字符。 
如果是在繁體中文windows系統上,可能包含繁體中文字符,如果是簡體中文系統,則為GB2312編碼,如果是繁體中文系統,則為BIG 5碼。 

2、WideString

功能上類似於AnsiString,但它是由WideChar字符(UniCode字符集)組成的。引入這種類型,主要是為了支持OLE編程。而且還有一個實用的功能,就是當一個字符串是中英文字符混雜時,能夠准確計數字符數,並可分別訪問其中每一個中文字符或英文字符,如果一個AnsiString中含有中英文字符時,就不容易確定字符數,也無法准確訪問其中的每一個字符。

  • AnisString字符串的每一個字節都不為零,但WideString的內存字節可能為0。
  • AnsiString內存字節中,有可能一個字節代表一個字符,也可能兩個字節代表一個字符,WideString全部是兩個字節代表一個字符。

可以將一個WideString賦給一個AnsiString,也可以將一個AnsiString賦給一個WideString,在賦值過程中將發生編碼轉換,如果一個WideString中的Unicode字符在ANSI字符集編碼范圍之外,則該Unicode字符被轉為? (0x3F),所以就會出現拷貝一些阿拉伯字符串到文本框中后變成一串?的情況。

Unicode編碼則是采用雙字節16位來進行編號,可編65536字符,基本上包含了世界上所有的語言字符,它也就成為了全世界一種通用的編碼,而且用十六進制4位表示一個編碼,非常簡結直觀,為大多數開發者所接受。


AnsiString(或長字符串)類型是在Delphi2.0開始引入的,因為Delphi   1.0的用戶特別需要一個容易使用而且沒有255個字符限制的字符串類型,而AnsiString正好能滿足這些要求。 雖然AnsiString在外表上跟以前的字符串類型幾乎相同,但它是動態分配的並有自動回收功能,正是因為這個功能AnsiString有時被稱為生存期自管理類型。Object   Pascal能根據需要為字符串分配空間,所以不用像在C/C++中所擔心的為中間結果分配緩沖區。另外,AnsiString字符串總是以null字符結束的,這使得AnsiString字符串能與Win32   API   中的字符串兼容。實際上,AnsiString類型是一個指向在堆棧中的字符串結構的指針。


WideString類型像AnsiString一樣是生存期自管理類型,它們都能動態分配、自動回收並且彼此能相互兼容,不過WideString和AnsiString的不同主要在三個方面:

  • WideString由WideChar字符組成,而不是由AnsiChar字符組成的,它們跟Unicode字符串兼容。 
  • WideString用SysAllocStrLen()API函數進行分配,它們跟OLE的BSTR字符串相兼容。 
  • WideString沒有引用計數,所以將一個WideString字符串賦值給另一個WideString字符串時,就需要從內存中的一個位置復制到另一個位置。這使得WideString在速度和內存的利用上不如AnsiString有效。

 

3、Utf8String

定義同string,  但一般存放Utf8編碼的字符串。

UTF-8編碼
這是一種變長的編碼方式:它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度,當字符在ASCII碼的范圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼做為它的一部分,如此一來UTF-8編碼也可以是為視為一種對ASCII碼的拓展。值得注意的是unicode編碼中一個中文字符占2個字節,而UTF-8一個中文字符占3個字節。從unicode到uft-8並不是直接的對應,而是要過一些算法和規則來轉換。
在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼。

例如:用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存里,編輯完成后,保存的時候再把Unicode轉換為UTF-8保存到文件。

 

 

 

創建時間:2020.12.24  更新時間:2021.05.04

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM