C+字符编码的转换、窄字符和宽字符的转换

一 字符编码转换(支持跨平台)

std::string AnsiToUtf8(const char * ansi){
#ifdef WIN32
	int len = MultiByteToWideChar(CP_ACP, 0, ansi, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len+1];
	memset(wstr, 0, len+1);
	MultiByteToWideChar(CP_ACP, 0, ansi, -1, wstr, len);
	len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	char* str = new char[len+1];
	memset(str, 0, len+1);
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
	if(wstr) delete[] wstr;
	std::string ret = str;
	if(str) delete[] str;
	return ret;
#else
	std::string ret;

	int in_buflen = strlen(ansi);
	char * in_buf = new char[in_buflen + 1];
	memcpy(in_buf, ansi, strlen(ansi));

	int out_buflen = 2 * in_buflen;
	char * out_buf = new char[out_buflen + 1];

	char from_charset[] = "gb2312";
	char to_charset[] = "utf-8";
	CharConvert(from_charset, to_charset, in_buf, in_buflen, out_buf, out_buflen);
	ret = out_buf;
	delete [] in_buf;
	delete [] out_buf;

	return ret;
#endif
}

std::string Utf8ToAnsi(const char * utf8){
#ifdef WIN32
	int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len+1];
	memset(wstr, 0, len+1);
	MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
	len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
	char* str = new char[len+1];
	memset(str, 0, len+1);
	WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
	if(wstr) delete[] wstr;
	std::string ret = str;
	if(str) delete[] str;
	return ret;
#else
	std::string ret;

	int in_buflen = strlen(utf8);
	char * in_buf = new char[in_buflen + 1];
	memcpy(in_buf, utf8, strlen(utf8));

	int out_buflen = 2 * in_buflen;
	char * out_buf = new char[out_buflen + 1];

	char from_charset[] = "utf-8";
	char to_charset[] = "gb2312";
	CharConvert(from_charset, to_charset, in_buf, in_buflen, out_buf, out_buflen);
	ret = out_buf;
	delete [] in_buf;
	delete [] out_buf;

	return ret;
#endif
}

二 窄字符合宽字符转换

std::wstring StringToWString(std::string str){
	int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len+1];
	memset(wstr, 0, len+1);

	MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wstr, len);
	std::wstring ret(wstr);
	if(wstr) delete[] wstr;

	return ret;
}

std::string WStringToString(std::wstring wstr){
	int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
	char* str = new char[len+1];
	memset(str, 0, len+1);
	
	WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, str, len, NULL, NULL);
	std::string ret(str);
	if(str) delete[] str;
	return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值