VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 72|回复: 4

[已解决]各位大佬,请问怎么把string类型转换成LPCWSTR类型

[复制链接]
28_avatar_middle
最佳答案
0 
在线会员 发表于 2020-3-11 10:43:52 | 显示全部楼层 |阅读模式
各位大佬,请问怎么把string类型转换成LPCWSTR类型
最佳答案
77_avatar_small
2020-3-11 11:40:04
string 内部实际上是对 char* 的封装,所以,LPCWSTR 也就是 wchar_t*
所以,简单来说楼主的需求就是从窄字节转到宽字节

先调用这个函数将 string 转为 wstring:
  1. std::wstring gbk2unicode(std::string str_gbk)
  2. {
  3.         if (str_gbk.size() <= 0) return std::wstring(L"");

  4.         int u_len = MultiByteToWideChar(CP_ACP, 0, str_gbk.c_str(), str_gbk.size(), NULL, 0);
  5.         if (u_len <= 0) return std::wstring(L"");

  6.         wchar_t* lpsz_w = nullptr;
  7.         try
  8.         {
  9.                 lpsz_w = new wchar_t[u_len + 2];
  10.                 memset(lpsz_w, 0, (u_len + 2)*sizeof(wchar_t));
  11.         }
  12.         catch (bad_alloc& e)
  13.         {
  14.                 cout << "gbk2unicode : " << e.what() << endl;
  15.                 return std::wstring(L"");
  16.         }

  17.         int nRtn = MultiByteToWideChar(CP_ACP, 0, str_gbk.c_str(), str_gbk.size(), lpsz_w, u_len);
  18.         if (nRtn != u_len)
  19.         {
  20.                 delete[] lpsz_w;
  21.                 return std::wstring(L"");
  22.         }

  23.         std::wstring str_unicode;
  24.         str_unicode = lpsz_w;
  25.         delete[] lpsz_w;
  26.         return str_unicode;
  27. }
复制代码


之后,返回的 wstring 对象调用其 .c_str() 方法就是 LPCWSTR 类型啦




上一篇:Visual Studio 2013不能装在win7系统吗?
下一篇:为啥老师C/C++ Windows 程序设计中第二课没有包含头文件可以正确输入代码,我不行
87_avatar_middle
最佳答案
3 
在线会员 发表于 2020-3-11 15:21:50 | 显示全部楼层
本帖最后由 cqzj70 于 2020-3-11 15:31 编辑
Health 发表于 2020-3-11 11:40
string 内部实际上是对 char* 的封装,所以,LPCWSTR 也就是 wchar_t*
所以,简单来说楼主的需求就是从窄 ...


还搞得怎么复杂  
std::string ss="123";
std::wstring s =CStringW(ss.data());
LPCWSTR sp = s.data();

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!

查看全部评分

77_avatar_middle
最佳答案
24 
online_vip 发表于 2020-3-11 11:40:04 | 显示全部楼层    本楼为最佳答案   
string 内部实际上是对 char* 的封装,所以,LPCWSTR 也就是 wchar_t*
所以,简单来说楼主的需求就是从窄字节转到宽字节

先调用这个函数将 string 转为 wstring:
  1. std::wstring gbk2unicode(std::string str_gbk)
  2. {
  3.         if (str_gbk.size() <= 0) return std::wstring(L"");

  4.         int u_len = MultiByteToWideChar(CP_ACP, 0, str_gbk.c_str(), str_gbk.size(), NULL, 0);
  5.         if (u_len <= 0) return std::wstring(L"");

  6.         wchar_t* lpsz_w = nullptr;
  7.         try
  8.         {
  9.                 lpsz_w = new wchar_t[u_len + 2];
  10.                 memset(lpsz_w, 0, (u_len + 2)*sizeof(wchar_t));
  11.         }
  12.         catch (bad_alloc& e)
  13.         {
  14.                 cout << "gbk2unicode : " << e.what() << endl;
  15.                 return std::wstring(L"");
  16.         }

  17.         int nRtn = MultiByteToWideChar(CP_ACP, 0, str_gbk.c_str(), str_gbk.size(), lpsz_w, u_len);
  18.         if (nRtn != u_len)
  19.         {
  20.                 delete[] lpsz_w;
  21.                 return std::wstring(L"");
  22.         }

  23.         std::wstring str_unicode;
  24.         str_unicode = lpsz_w;
  25.         delete[] lpsz_w;
  26.         return str_unicode;
  27. }
复制代码


之后,返回的 wstring 对象调用其 .c_str() 方法就是 LPCWSTR 类型啦

评分

参与人数 1驿站币 +1 热心值 +1 收起 理由
28_avatar_small junjian + 1 + 1

查看全部评分

75_avatar_middle
最佳答案
13 
online_supermod 发表于 2020-3-11 11:16:44 | 显示全部楼层
上图 上代码  
77_avatar_middle
最佳答案
24 
online_vip 发表于 2020-3-11 15:31:26 | 显示全部楼层
cqzj70 发表于 2020-3-11 15:21
还搞得怎么复杂  
string ss="123";
LPCWSTR s = CStringW(ss.c_str());

这招也行哈,刚想起来
CString 的宽字节默认可以转换 窄字节的 char*
各位大佬,请问怎么把string类型转换成LPCWSTR类型
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-4-8 07:36

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表