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

时间:2021-04-18 20:18:59
或者将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"是可以的

10 个解决方案

#1


std::string a = "abcdefg";
std::wstring b(a.begin(),a.end());  //string 转换为wstring

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

#2


有 系统API 可以 完成这个转换  查一查就好了

#3


引用 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

#4


引用 1 楼 athrunarthur 的回复:
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end());  //string 转换为wstring

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

这个你没有考虑中文

#5


引用 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

你在那篇帖子里面回复的是使用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

#2


有 系统API 可以 完成这个转换  查一查就好了

#3


引用 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

#4


引用 1 楼 athrunarthur 的回复:
std::string a = "abcdefg";
std::wstring b(a.begin(),a.end());  //string 转换为wstring

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

这个你没有考虑中文

#5


引用 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

你在那篇帖子里面回复的是使用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;
}