Unicode和多位元組字符集 MBCS 雜談

2021-06-20 19:24:29 字數 2434 閱讀 3972

這個估計是很多人曾經頭疼過的問題,現在的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 程式設計,還必須:

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

單位元組字符集,多位元組字符集,Unicode

我們在這裡介紹一下字元型別。這裡有3種編碼模式對應3種字元型別。第一種編碼型別是單子節字符集 single byte character set or sbcs 在這種編碼模式下,所有的字元都只用乙個位元組表示。ascii是sbcs。乙個位元組表示的0用來標誌sbcs字串的結束。第二種編碼模式是多位...

Unicode 和多位元組字符集 MBCS

有些國際市場以大字符集來使用日文和中文等語言。為了支援這些市場的程式設計,microsoft 基礎類庫 mfc 支援以兩種方式處理大字符集 unicode 多位元組字符集 mbcs unicode 字串的 mfc 支援 整個類庫有條件地支援 unicode 字元和字串。特別是 cstring 類也支...

Unicode字符集和多字符集

由於各國語言的加入,ascii已經不能滿足資訊交流的需要,因此,為了能夠表示其它國家的文字,各國在ascii的基礎上制定了自己的字符集,它們正式的名稱應該是mbcs multi byte chactacter system,即多位元組字元系統 型別說明 unicode ansi 通用型別 字元wch...