宽字符、多字节、unicode、utf-8、gbk编码转化

时间:2023-01-14 22:24:46

今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型。

我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符。

我们在编程的时候经常遇到unicode,unicode是一种宽字节编码,能够很好的融合世界各个国家的字符,具有国际通用性,所谓宽字符其实使用两个字节来表示一个符号。

而utf8是一种多字节编码,一个字符所占用的字节数不确定,是对unicode的精简版本,也用具有世界通用性。Gbk也是一种双字节编码,其实就是对中文简体的一种编码,不具有世界通用性。其他的如韩文、日文都类似这种编码。

我遇到的编码的问题是这样的:

在cocos2dx项目中使用了CCEditBox,通过其函数getText()获取其中的文本,该字符串是windows的路径,但是路径中有中文。根据该路径调用windows API遍历该路径下的所有文件,结果找不到相关路径。我在程序中查看路径有乱码的情况,后来我将文本转化位GBK编码格式就正常了。

原因是这样的cocos2dx是按照utf8编码,他要走向世界,必须具有世界通用性,这也是它选择utf8的原因之一吧。所以getText()函数返回的是utf8编码的字符串,而windows API(中文版)用的是GBK编码格式,所以我们要转换一下格式,也就是将文本从utf8格式转换为GBK编码格式。Windows提供两个API可以完成这种转换。

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  );