WideCharToMultiByte 和 MultiByteToWideChar 之 codePage 參數(一)

MultiByteToWideChar 和 WideCharToMultiByte 函數的第一個參數是 CodePage,代碼頁,CSDN 的解釋是:Code page to use in performing the converison. 只是說,這個參數被用來執行轉換,並沒有說是目標字符的代碼頁,還是源字符的代碼頁,有點讓人發暈。

MultiByteToWideChar 是要將多字節序列寬字符序列轉化爲寬字符

當表示同一個含義,如“我是李志浩” 時,多字節字符序列和寬字符序列是兩種不現的表現外在形式,內涵其實是等價的。 “我是李志浩” 的內碼值(數學表示)是確定的,即它有唯一的 UNICODE 編碼值(它不能被 ANSI 編碼,因爲 ANSI 是英文字符加特殊符號編碼,不能表示中文; )。它還有唯一的 GBK 編碼(這個編碼系列從 gb2312 發展到 GBK 再發展到 GB18030,各代都做了兩件事情:增加內碼值,優化表示方式)。Windows 系統內部使用的是 UNICODE 編碼。

寬字符序列 (wchar_t*) 即是 Unicode 字節序列,內碼值序列,它是操作系統真正處理的字節序列。有不同的表現形式的一個事物,操作系統最終處理的必然是那個確定的事物:剔除了任何修飾,轉化後的那個確定的事物!

多字節序列(char*) 就是對於一個確定的事物的修飾,轉化後的東西:這句話“我是李志浩”用 UTF8 表示時,計算機能看到的是使用了 UTF8 技法轉換成的很多個字節。使用 GB2312 表示時,計算機能看到的又是另外一個外貌的很多個字節。總之,使用不同的表示方法時,計算機看到的總是不同的字節序列。這也就是“多字節序列”的含義。

現在假設,給計算機輸入一個使用 UTF8 編碼的中文絕對路徑 “D:/李志浩的工程/Test”,計算機想打開這個目錄,就要搞清楚它的含義。那麼問題來了,計算機收到了 “D:/李志浩的工程/Test”,但實際上計算機看到的是很多個字節的序列,爲了讓計算機懂這個序列是什麼含義,它還需要知道如何去解析這個多字節序列。於是,我們就給了計算機一個黑板,上面寫的是解析方法:

0xxxxxxx                                                                (00-7f)
110xxxxx 10xxxxxx                                                 (c0-df)(80-bf)
1110xxxx 10xxxxxx 10xxxxxx                                  (e0-ef)(80-bf)(80-bf)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx                    (f0-f7)(80-bf)(80-bf)(80-bf)
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx           (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)

左邊的是表現形式,用它去多字節序列中查找,解碼,右邊是 UNICODE 內碼值,計算機的內部表示。於是計算機就可以將上面的多字節序列轉換爲寬字節序列, wchar_t* ,此時,它終於可以理解那個路徑是啥了,可以處理。

上面提到的那個黑板,即是 codePage ,也就是這個多字節序列的編碼方式。

 WideCharToMultiByte 方法,從寬字節序列轉爲多字節序列,毫無疑問, WideChar 即是 Unicode 編碼序列,即內碼序列,計算機必然認識它,我們只需要告訴系統,需要轉化成的目標序列的編碼方式即可。也同樣就是 codePag 這個參數。

所以,綜上來看,MultiByteToWideChar 和 WideCharToMultiByte  的 codePage 參數,都是指多字節序列的編碼方式的(前者爲源,後者爲目標)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章