简介
字符串编码转换封装函数,UTF-8编码与本地编码互转。
中文乱码的解决方法
有时候我们会遇到乱码的字符串,比如:
- 古文码
可能是用GBK方式读取UTF-8编码的中文导致的,用下面的Utf8ToLocal(string str)
函数转换一下就可以了。 - 口字码
可能是因为以UTF-8的方式读取GBK编码的中文导致的,用下面的LocalToUtf8(string str)
函数转换一下能搞定。
代码
//将UTF-8编码的字符串转换为本地编码
string Utf8ToLocal(string str)
{
std::string result;
WCHAR* strSrc;
LPSTR szRes;
//获得临时变量的大小
int i = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
strSrc = new WCHAR[i + 1];
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, strSrc, i);
//获得临时变量的大小
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new CHAR[i + 1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
result = szRes;
delete[]strSrc;
delete[]szRes;
return result;
}
//将本地编码转换为UTF-8编码的字符串
string LocalToUtf8(string str)
{
std::string result;
WCHAR* strSrc;
CHAR* szRes;
int i;
// 获得临时变量的大小
i = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
strSrc = new WCHAR[i + 1];
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, strSrc, i);
// 获得临时变量的大小
i = WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new CHAR[i + 1];
WideCharToMultiByte(CP_UTF8, 0, strSrc, -1, szRes, i, NULL, NULL);
result = szRes;
delete[] strSrc;
delete[] szRes;
return result;
}