QString与char *之间的完美转换,支持含有中文字符的情况

636 阅读1分钟

1.QString转char *

如果QString没有中文,那么先将QString转换为std::string,再将std::string转换为char *。

如果QString有中文,那么先将QString转换为std::wstring,再将std::wstring转换为char *。

bool draw::read(const QString &path)//path是带有中文字符的
{
    //Qt获取环境变量中的TEMP目录;C:\Users\firecat\AppData\Local\Temp;
    QString pathTemp = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
    pathTemp += "\\tmp.dxf";
    std::string out = pathTemp.toStdString();
    std::wstring in = path.toStdWString();
    const char *outdxf = out.data();
    char *infile = wcharToChar(in.data());
    std::cout << outdxf << endl;
    std::cout << infile << endl;

    delete infile;
}

char *draw::wcharToChar(const wchar_t *wstr)
{
    if (!wstr || wstr == NULL)
    {
        return NULL;
    }

    unsigned int len = WideCharToMultiByte(CP_ACP, 0, wstr, wcslen(wstr) + 1, NULL, 0, NULL, NULL);
    char *cchar = new char[len]; //这里new,外部记得要释放内存
    memset(cchar, 0, len);
    WideCharToMultiByte(CP_ACP, 0, wstr, wcslen(wstr) + 1, cchar, len, NULL, NULL);

    return cchar;
}

wchar_t *draw::charToWchar(const char *str)
{
    if (!str || str == NULL)
    {
        return NULL;
    }

    unsigned int len = MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, NULL, 0);
    wchar_t *tchar = new wchar_t[len + 1]; //这里new,外部记得要释放内存
    memset(tchar, '\0', len + 1);
    MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, &tchar[0], len);

    return &tchar[0];
}


2. char * 转QString
可以使用QString的构造函数进行转换:QString(const QLatin1String &str);
QLatin1String的构造函数:QLatin1String(const char *str);
则如下语句是将char * mm转换为QString str:
str = QString(QLatin1String(mm));

 

3.std::string转QString

QString s = QString::fromStdString()

double d = 0.123456;

QString info =  QString::asprintf("%.3f", d);

 

x.网上看到了其他方法,也有先将QString转换为QByteArray,再将QByteArray转换为char *的方法,来看例子。

注意:不能用下面的转换形式char *mm = str.toLatin1().data();。因为这样的话,str.toLatin1()得到的QByteArray类型结果就不能保存,最后转换,mm的值就为空。

//#include "myclass.h"  
#include <QtGui/QApplication>  
#include <QtDebug>  
#include <QString>  
  
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
  
    QString str = "hello"; //QString转char *  
    QByteArray ba = str.toLatin1();  
    char *mm = ba.data();  
    qDebug()<<mm<<endl;  //调试时,在console中输出  
  
    QString nn = QString(QLatin1String(mm)); //char *转QString  
    qDebug()<<nn<<endl;  //调试时,在console中输出  
  
    //MyClass w;  
    //w.show();  
    return a.exec();  
}  

该方法,本人实测发现不能支持中文,中文会显示乱码。即QString内容包含中文时,转换char*会失败。

/*不可行,中文乱码
char cpath[MAX_PATH];
QByteArray ba = path.toLocal8Bit();
memcpy(cpath, ba.data(), ba.size() + 1); //加1是为了最后的终结符,否则转换回来的时候不知道什么时候截止
char *infile2 = cpath;
std::cout << infile2 << endl;*/


/*******************************************
QString和QByteArray提供了非常便利的operator+,以允许你写这样的代码:
QString directory = /*...*/, name = /*...*/;
QString dataFile = directory + QLatin1Char('/') + name + QLatin1String(".dat");
**********************************************/