概述
在用 rapidjson 解析本地 json 文件的时候,发现中文字符显示乱码,json 文件是用 UTF8 编码的,VS 项目所使用的是 Unicode 字符集,因此需要将在 json 中获取到的 string 转为 wstring。
相关函数
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
功能:映射一个字符串到一个宽字符(unicode)的字符串。
- CodePage 指定需要转换的字符集
- CP_UTF8 使用 UTF8 转换
- CP_ACP 使用 ANSI 转换
- lpMultiByteStr 指向要转换的字符串
- cbMultiByte lpMultiByteStr 参数的字节大小,如果将值设为 -1,字符串为 null 终止,并自动计算长度。
- lpWideCharStr 指向接收转换后的字符串的缓冲区的指针
- cchWideChar 指定由参数 lpWideCharStr 指向的缓冲区的宽字符个数,若这个值为 0,函数返回缓冲区所必需的宽字符数。
代码
wstring UTF8ToUnicode(const string &s)
{
wstring result;
// 获得缓冲区的宽字符个数
int length = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0);
wchar_t * buffer = new wchar_t[length];
::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, buffer, length);
result = buffer;
delete[] buffer;
return result;
}