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


相关文章
|
IDE 开发工具 C++
VS2015+Qt5.9.8编译报错:error MSB6006: “cmd.exe”已退出,代码为 2
VS2015+Qt5.9.8编译报错:error MSB6006: “cmd.exe”已退出,代码为 2
3802 0
|
运维 监控
浅析SPI与CAN通信
SPI是一种常用的MCU与外设的通信方式,英文全称Serial Peripheral Interface。与之前介绍过的UART不同,SPI是串行,全双工,同步通信方式。SPI通常有4根物理连接线,分别是CS片选,SCK时钟,MOSI主机输出从机输入和MISO主机输入从机输出。CS片选是从机选择信号线,低电平有效。当CS为低电平时认为主机目前选中的本从机。SCK是串行时钟线,同步通信需要主从机时钟同步,主机利用SCK线与从机实现时钟同步。时钟由主机产生,决定了通讯的速率。
1247 0
关于 QtCreator中写Qt程序遇到printf不输出问题 的解决方法
关于 QtCreator中写Qt程序遇到printf不输出问题 的解决方法
|
4月前
|
机器学习/深度学习 IDE 数据挖掘
2026最新Jupyter Notebook安装使用保姆级教程(附安装包+图文步骤)
Jupyter Notebook是基于网页的交互式编程工具,支持Python、R等数十种语言。以单元格为单位执行代码,即时显示结果,融合代码、文字与图表,适合数据分析、教学及报告编写。推荐通过Anaconda一键安装。
|
5月前
|
缓存 人工智能 运维
大模型落地生产环境,Claude 4.6 成本失控前必须做的架构调整
大模型落地后,高昂API成本成最大瓶颈。本文提出三大降本动作:1)严控Token消耗与生命周期,善用Prompt缓存;2)实施模型分层路由,按需调用Opus/Sonnet/Haiku;3)引入聚合网关,统一接入、自动容灾、对公结算。早治理,早见效。
474 0
大模型落地生产环境,Claude 4.6 成本失控前必须做的架构调整
|
编解码 UED
Qt侧边栏的动态切换:隐藏与显示技术详解
在现代用户界面设计中,侧边栏(Sidebar)是一个常见的组件,它为用户提供了导航和工具面板的功能。在某些应用场景下,我们可能需要动态地隐藏或显示侧边栏,以优化界面布局或提供更灵活的用户体验。本文将分享如何在Qt框架下实现侧边栏的隐藏与呈现,包括技术细节和代码示例。
1574 3
|
弹性计算 数据管理 应用服务中间件
活动实践 | 借助OSS搭建在线教育视频课程分享网站
本教程指导用户在阿里云ECS实例上搭建在线教育网站,包括重置ECS密码、配置安全组、安装Nginx、创建网站页面、上传数据至OSS、开通OSS传输加速、配置生命周期策略及清理资源等步骤,实现高效、低成本的数据管理和网站运营。
活动实践 | 借助OSS搭建在线教育视频课程分享网站
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
3271 3
|
监控 前端开发 开发者
前端代码规范 - 日志打印规范
前端代码规范 - 日志打印规范