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

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

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");

**********************************************/


---


姊妹篇:


string和wstring之间转换的三种方法


https://libaineu2004.blog.csdn.net/article/details/119393505


相关文章
|
4月前
窄字节宽字节的互转(string--wstring)
窄字节宽字节的互转(string--wstring)
|
8月前
|
自然语言处理 C语言 C++
33.【C/C++ char 类型与Ascii大整合,少一个没考虑你打我】(一)
33.【C/C++ char 类型与Ascii大整合,少一个没考虑你打我】
30 0
|
8月前
|
C++
33.【C/C++ char 类型与Ascii大整合,少一个没考虑你打我】(二)
33.【C/C++ char 类型与Ascii大整合,少一个没考虑你打我】
51 0
|
8月前
|
C++
33.【C/C++ char 类型与Ascii大整合,少一个没考虑你打我】(三)
33.【C/C++ char 类型与Ascii大整合,少一个没考虑你打我】
29 0
|
8月前
|
存储 算法 C语言
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
36 0
wchar_t转换为jstring
wchar_t转换为jstring
70 0
运行成功:char转换为wchar_t的代码
运行成功:char转换为wchar_t的代码
64 0
|
存储 Python
Python bytes字节串与string字符串之间的转换
Python bytes字节串与string字符串之间的转换
char*转换为jstring
char*转换为jstring
181 0