1. 程式人生 > >Unicode和多位元組字符集 (MBCS)

Unicode和多位元組字符集 (MBCS)

最近在使用VS2008編寫一個MFC的工程專案,裡面在專案屬性中字符集的設定中編碼方式有“使用UNICODE”和“使用多位元組”兩種字符集,有時候編譯出錯,更改字符集選項,編譯就通過,於是對這兩種產生了疑問,下面通過一篇轉載的文章向大家介紹一下這兩種方式。


總結一下:

(1)當編譯出現類似“引數型別轉換”這樣的問題時,這種情況一般是字符集的那裡有問題,在使用Unicode時出現,這樣的問題大多將字串常量,等新增_T()表示。。。在開發中經常遇到這樣的問題,屢試不爽,經驗所得;

(2)在下面的參考中,作者提到了針對字串的函式的一些呼叫的不同,諸如

如果 CString 函式通常情況下呼叫strcmp

,那麼它會呼叫相應的一般文字函式 _tcscmp。詳細的大家可以參看如下:(

Unicode和多位元組字符集 (MBCS) 雜談 (此轉自一個新浪微博)

多人曾經頭疼過的問題,現在的VC版本基本都支援Unicode和多位元組字符集(MBCS),在進行MFC程式設計時VC的預設設定是unicode字符集。但是我們通常需要做一些程式碼移植的工作,如果將多位元組字符集下的程式程式碼移植到unicode字符集環境中,就需要針對此做出很多型別的轉換,反之亦然。

首先,瞭解一下unicode和多字元字符集(MBSS)的區別:

在計算機中字元通常並不是儲存為影象,每個字元都是使用一個編碼來表示的,而每個字元究竟使用哪個編碼代表,要取決於使用哪個字符集(charset)。  在最初的時候,Internet上只有一種字符集——ANSI的ASCII字符集,它使用7 bits來表示一個字元,總共表示128個字元,其中包括了英文字母、數字、標點符號等常用字元。之後,又進行擴充套件,使用8 bits表示一個字元,可以表示256個字元,主要在原來的7 bits字符集的基礎上加入了一些特殊符號例如製表符。  後來,由於各國語言的加入,ASCII已經不能滿足資訊交流的需要,因此,為了能夠表示其它國家的文字,各國在ASCII的基礎上制定了自己的字符集,這些從ANSI標準派生的字符集被習慣的統稱為ANSI字符集,它們正式的名稱應該是MBCS(Multi-Byte Chactacter System,即多位元組字元系統)。

由於每種語言都制定了自己的字符集,導致最後存在的各種字符集實在太多,在國際交流中要經常轉換字符集非常不便。因此,提出了Unicode字符集,它固定使用16 bits(兩個位元組、一個字)來表示一個字元,共可以表示65536個字元。將世界上幾乎所有語言的常用字元收錄其中,方便了資訊交流。標準的Unicode稱為UTF-16。

多位元組字符集(MBCS),字元的寬度可以是一個位元組,也可是兩個位元組。如果字元的寬度是兩個位元組,那麼它的第一個位元組就是一個特殊的“前導位元組”,該位元組是根據所使用的內碼表從某個特定範圍選定的。前導位元組和“尾位元組”合起來指定一個唯一的字元編碼。

如果為程式的生成定義了符號 _MBCS

,則型別 TCHARCString基於該型別)將對映到 char。由您來決定 CString 中的哪些位元組是前導位元組,哪些位元組是尾位元組。C執行時庫提供函式來幫助您進行確定。

在 DBCS 下,給定的字串可以包含所有的單位元組 ANSI字元、所有的雙位元組字元或兩者的組合。這些可能性需要您在分析字串(包括 CString 物件)時要備加小心。

注意   MFC中的 Unicode 字串序列化能夠讀取 Unicode 和 MBCS字串,而不論執行的是哪個版本的應用程式。正因為如此,資料檔案在程式的 Unicode 和 MBCS版本之間是可移植的。

CString 成員函式使用其呼叫的 C 執行時庫特殊的“一般文字”版本,或使用識別 Unicode 的函式,如lstrlenlstrcpy。因此,如果 CString 函式通常情況下呼叫strcmp,那麼它會呼叫相應的一般文字函式 _tcscmp。根據符號 _MBCS_UNICODE 定義方式的不同,_tcscmp 對映如下:

           _MBCS已定義           _mbscmp            _UNICODE已定義        wcscmp 兩者都未定義           strcmp

注意   符號_MBCS_UNICODE 是互相排斥的。

CString 是基於 TCHAR 資料型別的。如果為程式的生成定義了符號_UNICODE,則會將 TCHAR 定義為 wchar_t 型別(一個 16位的字元編碼型別);否則,會將它定義為 char(普通的 8 位字元編碼)。於是,在 Unicode下,CString 由 16 位字元組成。如果沒有 Unicode,它們則由 char型別的字元組成。

要完成應用程式的 Unicode 程式設計,還必須:

  • 使用 _T 巨集有條件地編寫字串的程式碼,使之可移植到 Unicode。
  • 當傳遞字串時,請注意函式引數要求的長度是以字元為單位還是以位元組為單位的。如果在使用 Unicode字串,這一區別是很重要的。
  • 使用 C 執行時字串處理函式的可移植版本。
  • 使用以下用於字元和字元指標的資料型別:
    • TCHAR   這裡將使用char
    • LPTSTR   這裡將使用char*
    • LPCTSTR   這裡將使用const char*CString 提供 operator LPCTSTR 來在CStringLPCTSTR 之間進行轉換。

CString 還提供識別 Unicode 的建構函式,賦值運算子和比較運算子。