汉字乱码 UTF8 UNICODE

问题起源: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很方便


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值