c 下各種字串的一點心得 字符集與編碼

2021-09-30 02:56:59 字數 2169 閱讀 9153

前言    

你是否看到各大**上鋪天蓋地的關於tchar, std::string, bstr 等各種各樣的字串型別,還有那些以 _tcs 開頭的奇怪的巨集。還有例如ascii, dbcs, unicode編碼方式。

這裡先解釋一下關於字元的基礎問題。所有的 string 類都是以c-style字串為基礎的。在作業系統中字元分**頁按照**對映表示不同語言的符號,不同的語言可能使用不同的**頁。例如,ansi **頁 1252 用於英語和大多數歐洲語言,而 ansi **頁 932 則用於日本漢字。實際上,所有**頁都共享 ascii 字符集中最低的 128 個字元(0x00 到 0x7f)。系統存在三種編碼方式,ascii, dbcs和 unicode。ascii 字符集只有256個字元,用 0-255 之間的數字來表示。包括大小寫字母、數字以及少數特殊字元;如標點符號、貨幣符號等。對於大多數拉丁語言來說,這些字元已經夠用。但是,許多亞洲和東方語言所用的字元遠遠不止256個字元。有些超過千個。人們為了突破 ascii 碼字元數的限制,試圖用一種簡單的方法來針對超過256個字元的語言編寫電腦程式。於是 unicode 應運而生。unicode 通過用雙位元組來表示乙個字元,從而在更大範圍內將數字**對映到多種語言的字符集。第一種編碼型別是單子節字符集(single-byte character set or sbcs)。在這種編碼模式下,所有的字元都只用乙個位元組表示。ascii是sbcs。乙個位元組表示的0用來標誌sbcs字串的結束。第二種編碼模式是多位元組字符集(multi-byte character set or mbcs)。乙個mbcs編碼包含一些乙個位元組長的字元,而另一些字元大於乙個位元組的長度。用在windows裡的mbcs包含兩種字元型別,單位元組字元(single-byte characters)和雙位元組字元(double-byte characters)。由於windows裡使用的多位元組字元絕大部分是兩個位元組長,所以mbcs常被用dbcs代替。在dbcs編碼模式中,一些特定的值被保留用來表明他們是雙位元組字元的一部分。例如,在shift-jis編碼中(乙個常用的日文編碼模式),0x81-0x9f之間和 0xe0-oxfc之間的值表示"這是乙個雙位元組字元,下乙個子節是這個字元的一部分。"這樣的值被稱作"leading bytes",他們都大於0x7f。跟隨在乙個leading byte子節後面的位元組被稱作"trail byte"。在dbcs中,trail byte可以是任意非0值。像sbcs一樣,dbcs字串的結束標誌也是乙個單位元組表示的0。第三種編碼模式是unicode。unicode是一種所有的字元都使用兩個位元組編碼的編碼模式。unicode字元有時也被稱作寬字元,因為它比單子節字元寬(使用了更多的儲存空間)。注意,unicode不能被看作mbcs。mbcs的獨特之處在於它的字元使用不同長度的位元組編碼。unicode字串使用兩個位元組表示的0作為它的結束標誌。在 visual c++ 中,mbcs 始終是指 dbcs。不支援比兩個位元組寬的字符集。

如何選擇這三種編碼方式。對於想使你的程式國際化的程式設計師,這裡給出一點建議,如果你想在win2000或更高平台上執行,請選擇unicode編碼,這樣能換取更好效率,因為win2000底層的api是基於unicode編碼,如果選擇別的編碼方式,效能會在轉換編碼的時候有所損失,如果你想執行在win9x、win2000等時,選擇mbcs 。但此時需注意程式中對字元的操作,必須對字元進行操作,切勿對位元組進行操作,因為mbcs 情況下你不知道是否是雙位元組形式,這裡對於mfc類的方法基本都是基於字元操作的。另外為獲得靈活性,盡可能地使用執行時巨集(如_tcschr_tcscpy)。

說明1.在com裡面只支援unicode。

2.windows 2000整個os系統都是基於unicode的,為此在windows 2000下使用ansi是需要付出代價的,雖然在編碼上不用任何的轉換,但是這種轉化是隱藏的,是占用系統資源的(cpu,記憶體)。

3.在windows 98下必須使用unicode,則需要自己手動的編碼切換

windows 98 :只支援ansi。

windows 2k :既支援ansi又支援unicode。

windows ce :只支援unicode。

名詞解釋:

**頁:在unicode和dbcs中由於包含的**十分多,為了使用方便就需要對這些**進行組織。組織的方法就是把不同國家的**分別放入不同的**頁。字符集與**頁的關係:由上可知,對於unicode和dbcs,**頁是從屬於字符集的。但對於sbcs類的字符集(比如ansi)和dbcs之外的mbcs字符集(比如gb2312等)他們則只對應於乙個**頁。

c new字串的一點心得

c 中,new的用法很靈活,這裡進行了簡單的總結 1.new 分配這種型別的乙個大小的記憶體空間,並以括號中的值來初始化這個變數 2.new 分配這種型別的n個大小的記憶體空間,並用預設建構函式來初始化這些變數 include include using namespace std int main...

關於C語言字串函式使用的一點心得

就字串的拼接函式為例strcat.原型 extern char strcat char dest,char src 用法 include 功能 把src所指字串新增到dest結尾處 覆蓋dest結尾處的 0 並新增 0 說明 src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納s...

學習C 的一點心得

跟大家嘮嘮我的工作經歷和學習c 的看法,也算是無病呻吟了。培訓班的第二個好處是,他能幫你快速的搭建乙個知識網路,教你一些簡單的例項,看似基礎不穩,其實這是非常好的,因為想要在日常工作中了解這些知識網路,可能要走好多歪路,比如你c 剛學完c 基礎,了解了一點winform和wpf的皮毛就去找工作了,其...