UNICODE與MBCS等字元問題

2021-05-22 01:39:03 字數 2489 閱讀 3875

vs2008預設的字符集是unicode,而vc6.0預設是多位元組字符集,unicode字符集你要加_t("")或l"",你也可以「

工程-屬性-修改字符集」。

1.unicode:它是用兩個位元組表示乙個字元的方法。比如字元'a'在ascii下面是乙個字元,可'a'在unicode下面是

兩個字元,高字元用0填充,而且漢字'程'在ascii下面是兩個位元組,而在unicode下仍舊是兩個位元組。unicode的

用處就是定長表示世界文字,據統計,用兩個位元組可以編碼現存的所有文字而沒有二義。

2.mbcs,它是多位元組字符集,它是不定長表示世界文字的編碼。mbcs表示英文本母時就和ascii一樣(這也是我們

容易把mbcs和ascii搞混的原因),但表示其他文字時就需要用多位元組。

windows下面的程式設計可以支援mbcs和unicode兩種編碼的字串,具體用那種就看你定義了mbcs巨集還是

unicode巨集。mbcs巨集對應的字串指標是char*也就是lpstr,unicode對應的指標是unsigned   short*也就是

lpwstr,為了寫程式方便微軟定義了型別lptstr,在mbcs下他就是char*,   在unicode下它是unsigned  

char*,這樣你就可以重定義乙個巨集進行不同字符集的轉換了。

3. lptstr、lpcstr、lpctstr、lpstr的意義

lpstr:  32-bit指標 指向乙個字串,每個字元佔1位元組

lpcstr:  32-bit指標 指向乙個常字串,每個字元佔1位元組

lpctstr: 32-bit指標 指向乙個常字串,每字元可能佔1位元組或2位元組,取決於unicode是否定義

lptstr:  32-bit指標 每字元可能佔1位元組或2位元組,取決於unicode是否定義

windows使用兩種字符集ansi和unicode,前者就是通常使用的單位元組方式,但這種方式處理象中文這樣的雙位元組

字元不方便,容易出現半個漢字的情況。而後者是雙位元組方式,方便處理雙位元組字元。windowsnt的所有與字元

有關的函式都提供兩種方式的版本,而windows9x只支援ansi方式。_t一般同字常數相關,如_t("hello"。如果

你編譯乙個程式為ansi方式,_t實際不起任何作用。而如果編譯乙個程式為unicode方式,則編譯器會把"hello"

字串以unicode方式儲存。_t和_l的區別在於,_l不管你是以什麼方式編譯,一律以unicode方式儲存.

4.例1:

windows核心程式設計的第一章。

l是表示字串資源為unicode的。

比如wchar_t str = l"hello world!";    這個就是雙子節儲存字元了。

_t是乙個適配的巨集~

當#ifdef _unicode的時候

_t就是l

沒有#ifdef _unicode的時候

_t就是ansi的。

比如lptstr lpstr = new tchar[32];

tchar* szbuf = _t("hello");

以上兩句使得無論是在unicode編譯條件下都是正確編譯的。

而且ms推薦你使用相匹配的字串函式。

比如處理lptstr或者lpctstr 的時候,不要用strlen ,而是要用_tcslen

否則在unicode的編譯條件下,strlen不能處理 wchar_t*的字串。

t是非常有意思的乙個符號(tchar、lpctstr、lptstr、_t()、_text()...),它表示使用一種中間型別,既不

明確表示使用 mbcs,也不明確表示使用 unicode。那到底使用哪種字符集?編譯的時候才決定

在大多數情況下,cstring 轉換成 lptstr是非常容易的,如果函式要求傳入lptstr型的引數,直接傳乙個

cstring也行,但是在visual studio 2008中,卻偶爾會出現不能轉換的情況,這個為什麼呢?

有人以為這是ascii(多位元組)與unicode(寬位元組)之間的問題,其實不是,要知lptstr這個巨集是隨編譯器引數

不同而不同的,如果在編譯器——常規裡面設定程式按ascii編譯,那lptstr就表示char*,如果選擇按unicode

編譯那就是wchar_t*。cstring也是如此,隨編譯器選項的不同,可以是ascii字串也可以是unicode字串。

那麼cstring與lptstr,要麼全是多位元組,要麼全是寬位元組,不可能存在兩者之間不能轉換的問題。

例2:

1. 如何將 cstring 型轉換為 lpbyte

cstring   str;   

lpbyte   by   =   (lpbyte)(lpcstr)str;

2. lpbyte 如何轉為cstring 型

cstring   str;

str.format("%s", by);

MBCS與Unicode的轉換

1.使用widechartomultibyte 假設已經有了乙個unicode 串 wszsomestring.char szansistring max path widechartomultibyte cp acp,wc compositecheck,wszsomestring,1,szansi...

Unicode 和多位元組字符集 MBCS

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

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

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