寬字符、多字節、unicode、utf-八、gbk編碼轉化

今天遇到一個編碼的問題,困惑了我很長時間,因此就簡要的的瞭解了一下經常使用的編碼類型。編程

咱們最多見的是assic編碼,它是一種單字節編碼,對多容納256個字符。windows

咱們在編程的時候常常遇到unicode,unicode是一種寬字節編碼,可以很好的融合世界各個國家的字符,具備國際通用性,所謂寬字符其實使用兩個字節來表示一個符號。app

而utf8是一種多字節編碼,一個字符所佔用的字節數不肯定,是對unicode的精簡版本,也用具備世界通用性。Gbk也是一種雙字節編碼,其實就是對中文簡體的一種編碼,不具備世界通用性。其餘的如韓文、日文都相似這種編碼。ide

我遇到的編碼的問題是這樣的:函數

在cocos2dx項目中使用了CCEditBox,經過其函數getText()獲取其中的文本,該字符串是windows的路徑,可是路徑中有中文。根據該路徑調用windows API遍歷該路徑下的全部文件,結果找不到相關路徑。我在程序中查看路徑有亂碼的狀況,後來我將文本轉化位GBK編碼格式就正常了。編碼

緣由是這樣的cocos2dx是按照utf8編碼,他要走向世界,必須具備世界通用性,這也是它選擇utf8的緣由之一吧。因此getText()函數返回的是utf8編碼的字符串,而windows API(中文版)用的是GBK編碼格式,因此咱們要轉換一下格式,也就是將文本從utf8格式轉換爲GBK編碼格式。Windows提供兩個API能夠完成這種轉換。spa

1 int MultiByteToWideChar(    
2 UINT CodePage,           // code page,使用CP_ACP代碼頁就實現了ANSI與Unicode之間的轉換,使用CP_UTF8代碼頁就實現了UTF-8與Unicode之間的轉換
3 DWORD dwFlags,          // character-type options,通常爲設0  
4 LPCSTR lpMultiByteStr,  // string to map,指向一個多字節字符串   
5 int cbMultiByte,         // number of bytes in string,多字節字符串的長度(字節數,當以0結尾的時候,也能夠設爲-1)    
6 LPWSTR lpWideCharStr,  // wide-character buffer,存放轉換後的寬字符串緩衝區  
7 int cchWideChar        // size of buffer,寬字符串緩衝區的最大長度(字符數)
8 ) 
 1  int WideCharToMultiByte(    
 2 UINT CodePage,            // code page,使用CP_ACP代碼頁就實現了ANSI與Unicode之間的轉換,使用CP_UTF8代碼頁就實現了UTF-8與Unicode之間的轉換
 3 DWORD dwFlags,          // performance and mapping flags,通常爲設0   
 4 LPCWSTR lpWideCharStr,    // wide-character string,指向一個寬字符串   
 5 int cchWideChar,          // number of chars in string,寬字符串的長度(字符數)  
 6 LPSTR lpMultiByteStr,   // buffer for new string,存放轉換後的多字節字符串緩衝區   
 7 int cbMultiByte,          // size of buffer,多字節字符串緩衝區的最大長度(字節數)  
 8 LPCSTR lpDefaultChar,     // default for unmappable chars,轉換失敗的字符所顯示的字符串,通常設爲NULL    
 9 LPBOOL lpUsedDefaultChar  // set when default char used,若是有字符轉換失敗,則爲TRUE,通常設爲NULL 
10  );
相關文章
相關標籤/搜索