宽字符UTF-8转窄字符ANSI(使用tinyxml2乱码问题)

使用tinyxml2读取UTF-8编码的XML时,中文乱码,tiny没有类似于QString::tostdwstring的方法,需要几己转换一下。

对网上搜索的结果不甚满意,自己重写了一个方法。

std::string UTF8ToGBK( const char *iUTF8 )
{
	//宽字符长度
	int wclen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)iUTF8, -1, NULL, 0);
	wchar_t *wszGBK = new wchar_t[wclen+1];
	memset(wszGBK, 0, wclen+1);
	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)iUTF8, -1, (LPWSTR)wszGBK, wclen);

	//窄字符长度
	int clen = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
	char *szGBK = new char[clen+1];
	memset(szGBK, 0, clen + 1);
	WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, clen, NULL, NULL);

	std::string strTransf=szGBK;
	delete []szGBK;
	delete []wszGBK;

	return strTransf;
}

用到了memset(buffer, 0, sizeof(buffer)),它用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为0。例:char a[100];memset(a, 0, sizeof(a));

 

另外,对于const char*与char*之间的转换,

1.const char*不能直接赋值到char*,理由:假如可以的话,那么通过char*就可以修改const char*指向的内容,这是不允许的。所以char*要另外开辟新的空间。

 const char* cpc="abc";
 char* pc=new char[100];
 strcpy(pc,cpc);


2.char*到 const char*直接赋值即可

char* pc="abcde";const char* cp=pcc;

你可能感兴趣的:(编码,XML)