c++ UTF8 的 string 转为 Unicode 的 wstring

概述

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

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值