1. 程式人生 > >寬字元和普通字元的區別

寬字元和普通字元的區別

在我們常用的型別string和char中,對中文支援並不是很好。在這兩種型別中,中文都是兩個位元組,也就是說中文的漢字要佔用兩個位置,舉個簡單的例子,一個“漢”字用一個char是無法表示的,即    char c = '漢' ;  是錯誤的,必須用 char c[3]  = "漢". 漢字佔用兩個位元組,還有一個結尾符“0/”。string s = "漢" ; s.length()的值是2. 

通過以上描述,我們會發現,我們在進行包含中文字串處理的過程中就會遇到以下問題:在包含數字,字母,漢字的字串處理中我們應該怎樣應付各個字元佔多少個位元組?總不能在處理之前先轉換成ASCII碼判斷它屬於哪種字元在進行處理吧?中文取兩個,字母和數字取一個。在進行判斷相等與否時也遇到了問題。 


1. string s = “中國人”; 想知道第二個字是不是“國”字,不能夠直接使用 "s[2] == "國"",這樣的s[2]是指“國”字的前一個位元組代表的數字,是個負數,兩個根本無法相等。必須使用 strncmp(&s[2], "國", 2);  這個函式來進行匹配。這個函式的含義是對字串進行比較,將從第一個引數位置開始的第三個引數個字元與第二個引數進行比較,如果相等則返回0,不相等就返回1.具體到本例中s[2]開始的2個字元與“國”字進行比較。在這用情況下,不僅增加了表達的複雜度,而且增加了演算法的複雜度。 
2. 想進行匹配或者其他處理必須先判斷型別,也就是要維護一個幾乎和原字串等長的型別連結串列,用於標記原字串各個位置上的型別。在進行操作時,先判斷型別,數字和字母等往後挪一位,漢字等往後挪兩位,這樣即麻煩又浪費儲存空間。 

3. 不知者在進行匹配時,用過使用 s[i] == p[j] 時會產生意想不到的結果。我就是問題出在這裡。用字母進行匹配時一點問題也沒有,簡單的幾個漢字也沒有問題,但是當我使用幾萬字的兩個文字進行匹配時就產生了很大的問題。每個漢字會被拆成兩個負整數來表示,假設一個漢字被拆成了-3444,-1235,另外一個被拆成了-6433,-1235,那麼本來毫無關係的兩個漢字就會錯誤的被認為成第二個是相等的,最終的結果就會產生錯誤。 

經過研究,發現在c++中還存在另外一個字符集體系,我之前一直沒有注意到過,直到現在才明白怎麼回事。 

wchar_t 和 wstring的出現很好的解決了這些問題。 

wchar_t c = ‘漢’; 不會出現任何問題。對應的字串則為wstring。在這兩個型別中,預設的情況下字母和數字就佔用1個位元組,而漢字漢用2個位元組,能夠很好的解決上面提到的三個問題。如:wstring s = "中國人abc" ; s.length() 的值是6,在string型別下值是9,這基本就是wstring和string的差別。 


針對wstring有對應的fopen方法。對於Unicode的檔案,使用下面方式讀取檔案,與預設的不太一樣。