std::wstring 如何转换为std::string

yangyunzhao 2009-08-24 12:51:38
或者将wchar_t*转换为char*也可以的。
需要能够跨平台的。我的主程序是QT


QString fileName = QFileDialog::getOpenFileName(this,tr("Open RDF DB"),".",tr("RDF DB files (*.rdf)"));//此处就是通过对话框得到文件路径

std::wstring x = rdfFileName.toStdWString(); //跟踪进来的时候此处是正常的值
std::string xx = WString2String(x); //而此处的值就不是正常的值了,路径中的中文全部变成了乱码

//我后面还要调用别人写好的一个接口去打开这个文件,而别人给我的接口中,参数是const char*
//我如果用x.c_str()要报错,不能从const w_char* 到const char*。
//而用xx.c_str(),更不行了啊


有什么方法将std::wstring转换为std::string,或者将const wchar_t*转换为char*也好啊。
对了,在调用别人接口的时候,如果我直接传参数 "c:\\中文\\1.txt"是可以的
...全文
4280 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakashi0309 2009-08-24
  • 打赏
  • 举报
回复
修改下W2C试试

void W2C(const wchar_t *pw , char *pc)
{
*pc++ = (*pw)& 0xFF;
*pc = (*pw)>>8;
}
yangyunzhao 2009-08-24
  • 打赏
  • 举报
回复
下面的这个代码还是输出的乱码

#include <iostream>

using namespace std;

void W2C(const wchar_t *pw , char *pc)
{
*pc++=*pw>>8;
*pc=*pw;
}

char *wstr2cstr(const wchar_t *pwstr , char *pcstr)
{
char *ptemp = pcstr ;
if(pwstr!=NULL && pcstr!=NULL)
{
size_t wstr_len = wcslen(pwstr) ;
while( wstr_len -- > 0)
{
W2C(pwstr , pcstr);
pwstr++ ;
pcstr +=2 ;
}
*pcstr = '\0';
return ptemp ;
}
return 0 ;
}

int main(int arg , char *argv[])
{
const wchar_t *pwstr = L"这里是中文";
int wsize = wcslen(pwstr);
char *pcstr = (char *)new char[2*wsize+1] ;
memset(pcstr, 0, 2*wsize+1 );
wstr2cstr(pwstr,pcstr) ;
cout<<pcstr<<endl;
delete []pcstr ;

}
kakashi0309 2009-08-24
  • 打赏
  • 举报
回复
linux下有iconv 是进行字符集的转换 中文需要考虑编码格式的
yangyunzhao 2009-08-24
  • 打赏
  • 举报
回复
恩,需要再Windows和linux下面跑。界面是用的QT,程序内部也只用了stl的东西,没有用Windows的库。
AthrunArthur 2009-08-24
  • 打赏
  • 举报
回复
不好意思,是我没看清帖子,由于是跨平台的,所以不能使用windows API,对于中文的情况,可以先用wcstombs转换成UNICODE啊
yangyunzhao 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gongxinheng 的回复:]
引用 1 楼 athrunarthur 的回复:
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end());  //string 转换为wstring

std::string c(b.begin(),b.end());  //wstring 转换为string


这样转换对于所有单字节的字符集来说没问题,但是遇到多字节的字符集(如中文)就有问题了,因为它是一个字符一个字符转换的,而一个中文包含两个字符

可以沿用这个帖子里我的回复里面的方法
http://topic.csdn.net/u/20090820/14/9b161fcd-c35e-4f0d-b860-6a81fa25fa10.html
[/Quote]
你在那篇帖子里面回复的是使用WIN32 API的方式。我需要的是跨平台的方式。
yangyunzhao 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 athrunarthur 的回复:]
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end());  //string 转换为wstring

std::string c(b.begin(),b.end());  //wstring 转换为string
[/Quote]
这个你没有考虑中文
HengStar 2009-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 athrunarthur 的回复:]
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end());  //string 转换为wstring

std::string c(b.begin(),b.end());  //wstring 转换为string
[/Quote]

这样转换对于所有单字节的字符集来说没问题,但是遇到多字节的字符集(如中文)就有问题了,因为它是一个字符一个字符转换的,而一个中文包含两个字符

可以沿用这个帖子里我的回复里面的方法
http://topic.csdn.net/u/20090820/14/9b161fcd-c35e-4f0d-b860-6a81fa25fa10.html
zhongjiekangping 2009-08-24
  • 打赏
  • 举报
回复
有 系统API 可以 完成这个转换 查一查就好了
AthrunArthur 2009-08-24
  • 打赏
  • 举报
回复
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end()); //string 转换为wstring

std::string c(b.begin(),b.end()); //wstring 转换为string

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧