今天遇到一個編碼的問題,困惑了我很長時間,因此就簡要的的瞭解了一下經常使用的編碼類型。編程
咱們最多見的是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 );