是不是應(yīng)該盡量使用UTF8String而不是String?for xe
我用的兩個(gè)控件,幾乎所有函數(shù)方法都是接受UTF8String
搞的我程序編譯下方一大堆字符類型提示
我在考慮是不是要把string都緩存utf8string
是不是能兼容更多字符編碼?
XE(2009及以后) 里的 string 是 UnicodeString,采用的是 winnt 系列的系統(tǒng)內(nèi)核字符集 utf-16(或稱 ucs2)。和 utf-16 le 一樣,utf-8 也是一種針對(duì) unicode 字符集的編碼,兩者表達(dá)的范圍是相同的。兩者的差別主要就在于編碼方式,前者基本上可以當(dāng)作是定長(zhǎng)的,而后者的長(zhǎng)度是不定的:utf-16 中,一個(gè)字符至少兩占2字節(jié),還有一些非常偏的字符占4字節(jié)(只有2和4兩種長(zhǎng)度,后者一般人用不到,連支持的字體都不好找);而 utf-8 中一個(gè)字符最少占1字節(jié),查了一下10月份剛出的6.0(
http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt),unicode 字符現(xiàn)在排到了 U+10FFFD,也就意味著目前最多占4字節(jié)(一般的漢字占3字節(jié))。兩者表達(dá)的都是 unicode 字符集,只是表達(dá)方式不同而已,不存在哪個(gè)比哪個(gè)更兼容。
由于 utf-8 的編碼方式與機(jī)器的 endian 無(wú)關(guān),并且容易檢驗(yàn)完整性,因此在傳輸上 utf-8 有非常大的優(yōu)勢(shì);另外,又由于許多文本中主要字符都是 ASCII 那些,所以在某些情況下的空間占用方面(尤其對(duì)美歐來(lái)說(shuō)),utf-8 也有優(yōu)勢(shì)。
在 win 平臺(tái)想要通過(guò) winapi 顯示字符的話,最終使用的都是 utf-16 的字符串(***A 版本在 api 內(nèi)部轉(zhuǎn)成 unicode)。因此一般情況下,可視化控件之類,直接使用 UnicodeString 是最方便的,只在儲(chǔ)存和傳輸時(shí)轉(zhuǎn)成 utf-8 就可以了。
在庫(kù)中使用 UTF8String 肯定要仔細(xì)權(quán)衡的,而不是隨隨便便就說(shuō)哪個(gè)一定比另外一個(gè)好。在一些情況下,核心處理功能在庫(kù)內(nèi)部,占用大量時(shí)間,遷移 unicode 版本的難度非常大,或者占用更多內(nèi)存,但效果又不一定好。這時(shí)候不如保留原來(lái)的 ANSI 版本庫(kù),稍作修改就可以支持 utf-8,不但支持了 unicode,內(nèi)存占用沒(méi)什么變化,代碼也沒(méi)做多大修改。
最常見(jiàn)的應(yīng)用就是字符串匹配,比如基于 B-M 算法的子串匹配,由其算法的原理決定,如果不采用 Integer*64k 的空間對(duì) utf-16 進(jìn)行匹配,對(duì)于純 ASCII 字符的搜索,就無(wú)法保證每次移動(dòng)都是最大可移動(dòng)距離,算法自身的性能發(fā)揮不出來(lái);但一次 256k 的空間占用又有點(diǎn)浪費(fèi)內(nèi)存,初始化的常數(shù)時(shí)間長(zhǎng),并且 CPU cache 裝這么多數(shù)據(jù)也影響后面搜索時(shí)的性能。采用 utf-8 的話,空間復(fù)雜度還是 256*4,常數(shù)初始化時(shí)間不變,每次移動(dòng)也基本上能保證較長(zhǎng)的長(zhǎng)度。所以比較復(fù)雜的字符串算法在支持 unicode 方面,直接采用 utf-16 的很少,而用 utf-8 的比較多。
再就是同時(shí)要考慮內(nèi)存占用的場(chǎng)景,正常情況下絕大多數(shù)內(nèi)容都是 ASCII 字符,使用 utf-16 過(guò)于浪費(fèi)空間。常見(jiàn)的應(yīng)用是詞法處理,比如編譯器或者 html、xml 等的詞法掃描器。
正則表達(dá)式是符合上面所有描述的應(yīng)用,自動(dòng)機(jī)的構(gòu)造和轉(zhuǎn)換非常復(fù)雜(詞法掃描也是用自動(dòng)機(jī)),由 ANSI 遷移至 utf-16 的難度大,空間復(fù)雜度也大大增加了。
---------------------------------------------- cnblogs中我寫(xiě)的關(guān)于Delphi的blog,歡迎訪問(wèn):
http://www.cnblogs.com/egust/
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。