天天看點

windows API程式設計之一----MBCS與Unicode碼制分析

本文并不打算講解Unicode的編碼問題,因為本文主要對以下幾個問題提一些見解:

1. MBCS多位元組碼的原理?

2. MBCS與Unicode的關系?

3. MBCS與Unicode的轉換?

4. MBCS與Unicode的列印,亂碼解決?

1:

早在Windows采用Unicode統一編碼進行語言管理之前,Windows為了能夠進行非ANSI标準字元的輸出,于是采用兩個位元組來表示這些語言文字。因為這些雙位元組文字和ANSI是混和在一起的,為了加以差別,Windows将這些字元的最高位置為1(即這些雙位元組文字的每個位元組都>=127),是以這種表示法可以表示 127x127 約一萬多種非ANSI文字,其本上可以表示任何一種語言的常用文字了。于是,Windows為每一個區域版本,都制定了分别獨立的文字編碼,這就是MBCS(多位元組碼)。

2: 

在采用Unicode之後,Windows仍然保留了MBCS技術,隻不過它對每一種MBCS與Unicode建立了一種映射關系,當然這是通過Unicode的語言區域碼實作的。windows對每個語言區域進行編号,并記錄其範圍。這樣,隻要給定這些區域編号,就可以實作任何MBCS與Unicode的轉換。

3:

通過windows的Api函數

1》完成Unicode到MBCS的轉換

int WideCharToMultiByte(

UINT CodePage,    

DWORD dwFlags,

LPCWSTR lpWideCharStr,    //寬字元指針

int cchWideChar,                

LPSTR lpMultiByteStr,

int cbMultiByte,

LPCSTR lpDefaultChar,

LPBOOL lpUsedDefaultChar );

2>完成MBCS到Unicode的轉換

int MultiByteToWideChar(

UINT CodePage,

DWORD dwFlags,

LPCSTR lpMultiByteStr,

int cbMultiByte,

LPWSTR lpWideCharStr,

int cchWideChar );

注意:

MBCS ASCII等求位元組長度使用strlen(str)

求Unicode字元個數使用wcslen(str)

char sz[] = "love中國";

WCHAR ss[] = L"love中國"; //L表示寬字元

int t = strlen(sz); //8

int j = wcslen(ss); //6

int m = sizeof(sz); //9

int n = sizeof(ss); //14 字元個數X2 + 2 (寬字元串依0X0000)結尾

sz記憶體結構

0012FF24 6C 6F 76 65 love

0012FF28 D6 D0 B9 FA 中國

0012FF2C 00 CC CC CC .燙.

ss記憶體結構

0012FF14 6C 00 6F 00 l.o.

0012FF18 76 00 65 00 v.e.

0012FF1C 2D 4E FD 56 -N齎

0012FF20 00 00 CC CC ..燙