今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型。
我们最常见的是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 );