概述

在用 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;
}

参考资料