需要能够跨平台的。我的主程序是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"是可以的
10 个解决方案
#1
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end()); //string 转换为wstring
std::string c(b.begin(),b.end()); //wstring 转换为string
std::wstring b(a.begin(),a.end()); //string 转换为wstring
std::string c(b.begin(),b.end()); //wstring 转换为string
#2
有 系统API 可以 完成这个转换 查一查就好了
#3
这样转换对于所有单字节的字符集来说没问题,但是遇到多字节的字符集(如中文)就有问题了,因为它是一个字符一个字符转换的,而一个中文包含两个字符
可以沿用这个帖子里我的回复里面的方法
http://topic.csdn.net/u/20090820/14/9b161fcd-c35e-4f0d-b860-6a81fa25fa10.html
#4
这个你没有考虑中文
#5
你在那篇帖子里面回复的是使用WIN32 API的方式。我需要的是跨平台的方式。
#6
不好意思,是我没看清帖子,由于是跨平台的,所以不能使用windows API,对于中文的情况,可以先用wcstombs转换成UNICODE啊
#7
恩,需要再Windows和linux下面跑。界面是用的QT,程序内部也只用了stl的东西,没有用Windows的库。
#8
linux下有iconv 是进行字符集的转换 中文需要考虑编码格式的
#9
下面的这个代码还是输出的乱码
#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 ;
}
#10
修改下W2C试试
void W2C(const wchar_t *pw , char *pc)
{
*pc++ = (*pw)& 0xFF;
*pc = (*pw)>>8;
}
#1
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end()); //string 转换为wstring
std::string c(b.begin(),b.end()); //wstring 转换为string
std::wstring b(a.begin(),a.end()); //string 转换为wstring
std::string c(b.begin(),b.end()); //wstring 转换为string
#2
有 系统API 可以 完成这个转换 查一查就好了
#3
这样转换对于所有单字节的字符集来说没问题,但是遇到多字节的字符集(如中文)就有问题了,因为它是一个字符一个字符转换的,而一个中文包含两个字符
可以沿用这个帖子里我的回复里面的方法
http://topic.csdn.net/u/20090820/14/9b161fcd-c35e-4f0d-b860-6a81fa25fa10.html
#4
这个你没有考虑中文
#5
你在那篇帖子里面回复的是使用WIN32 API的方式。我需要的是跨平台的方式。
#6
不好意思,是我没看清帖子,由于是跨平台的,所以不能使用windows API,对于中文的情况,可以先用wcstombs转换成UNICODE啊
#7
恩,需要再Windows和linux下面跑。界面是用的QT,程序内部也只用了stl的东西,没有用Windows的库。
#8
linux下有iconv 是进行字符集的转换 中文需要考虑编码格式的
#9
下面的这个代码还是输出的乱码
#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 ;
}
#10
修改下W2C试试
void W2C(const wchar_t *pw , char *pc)
{
*pc++ = (*pw)& 0xFF;
*pc = (*pw)>>8;
}