问题起源:Cocosdx里需要string作为参数的api,一般都要传入一个utf8格式的字符串,如果传的格式不对,就会被解成乱码显示。
我们先理解一些概念:
UTF-8 is an encoding - Unicode is a character set
Unicode是字符集,简单的说就是Unicode定义了一组数字到文字的对应关系,Unicode字符,通常会以UTF-16 ,也就是一个short来存储,这就是说,每个字符,即使是ANSI字符,也要用2个字节来存储。
UTF-8是一种编码方式,这是一个变长的存储方式,通常是1-3个字节。
std::string 标准库里的字符串是不会关心里面存放的字符是以什么格式存储的,他只是一个一个byte的读到字符串尾。
std::wstring 宽字节字符,一个字符占得位数,用wchar_t来表示,一般是2个字节
下面是一个wstring转换成UTF-8 格式的方法,使用之后要手动释放掉返回的字符串数组
//ret需要调用者手动free
char* Utils::getUTF8FromWstring(const std::wstring& tstr)
{
unsigned short tarr[1000];
wchar_t tlength = tstr.length();
for(wchar_t i = 0 ;i < tstr.length() ;i++)
{
tarr[i] = tstr.at(i);
}
tarr[tlength] = 0;
char* utfstr = cc_utf16_to_utf8(tarr,tlength,nullptr,nullptr);
return utfstr;
}
-------------------最后记录一些小细节------------------
UTF-16LE UTF-16BE 后面的LE BE指的是 Little/Big Endin
UTF-8,是可变长编码,是多字节编码,但它的编码不需要通过而外的BOM(Byte Order Marker)来说明(当然,也有使用BOM的UTF-8编码的)
连接wstring字符串的时候,用wstringstream很方便