首页 新闻 会员 周边 捐助

带中文的qstring转成const char *,且中文不乱码

0
悬赏园豆:180 [待解决问题]

请问怎么把带中文的qstring转成const char *,且中文不乱码?

我在网上搜过但无效的方法:
1.对qstring用tostdstring(),再对返回的数据用c_str()。
2.对qstring用tolocal8bit(),再对返回的数据用data()。
3.对qstring用tolocal8bit(),再对返回的数据用constData()。
4.对qstring用toutf8(),再对返回的数据用data()。
5.对qstring用toutf8(),再对返回的数据用constData()。

开发软件是vs2017+qt,开发语言市c++。文件我用nodepad++打开后发现是utf8bom编码。但在main.cpp里有如下代码:

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);

丶紫气东来的主页 丶紫气东来 | 初学一级 | 园豆:3
提问于:2024-03-14 11:47
< >
分享
所有回答(3)
0

我好像是先转成qchar*,记不清了,有两年没写这个了

echo_lovely | 园豆:1584 (小虾三级) | 2024-03-15 13:45

ChatGPT说:

QString str = "你好,世界!"; // 假设这是您的QString对象

// 将QString转换为UTF-8编码的const char *
const char *charStr = str.toUtf8().constData();

// 现在您可以使用charStr,确保中文字符不乱码

支持(0) 反对(0) echo_lovely | 园豆:1584 (小虾三级) | 2024-03-15 14:17
0

中文编码确实是个让人头疼的问题,我记得我之前也遇到过类似的情况,折腾了好一阵子才解决,让我来给你分享一下我的经验吧。

首先,你已经尝试了一些常见的转换方法,但似乎都没有奏效。QString到const char*的转换,尤其是涉及到中文时,确实需要一些小技巧。你的开发环境是VS2017配合Qt,这个环境下中文编码主要是UTF-8,你也正确地设置了QTextCodec::codecForName("UTF-8")

实际上,你提到的第4和第5种方法是比较常用的转换方式,即使用toUtf8()然后通过data()constData()获取const char*。通常,这种方法对于UTF-8编码的QString是有效的。但是,如果转换后出现乱码,很可能是在字符串使用过程中出现了问题。

我之前遇到的问题是这样解决的:确保转换后的const char*在使用期间,它的原始QByteArray对象依然有效。因为QString::toUtf8()返回的是一个QByteArray对象,如果这个QByteArray对象离开了它的作用域,那么由data()constData()返回的指针可能就会指向一块无效的内存,从而导致乱码。

举个例子:

const char* convertQStringToConstCharPtr(const QString& str) { QByteArray byteArray = str.toUtf8(); return byteArray.constData(); }

这个函数就有问题,因为当函数返回时,byteArray会被销毁,返回的指针就变成了悬空指针。

解决的办法是确保QByteArray的生命周期足够长,比如可以将QByteArray作为成员变量或者静态变量存储,以确保在const char*使用期间QByteArray依然有效。

还有一点要注意的是,如果你的应用程序在其他地方需要处理非UTF-8的编码,请确保转换逻辑与全局的编码设置兼容。

希望我的经验能对你有所帮助!

AI视界 | 园豆:318 (菜鸟二级) | 2024-03-20 00:34
0

这个如果你用 char* 你必须得搞清楚字符串编码。它基本有两种可能:UTF-8 或者 GBK(对于中文来说)。当你希望在 VS 里调试时看到字符串明文时,它必须是 GBK 编码,你才能看到正常中文。写入文件时,GBK 编码不需要任何 BOM。UTF-8 理论上也不需要 BOM,但是 Windows 平台上倾向于加三个字节的 UTF-8 BOM。要么你就把字符串转换到 UTF-16 (LE) 编码 (wchar_t * 形式)。不管你在 VS 调试中看到的还是写入文件中,都不会有乱码。

hoodlum1980 | 园豆:573 (小虾三级) | 2024-09-28 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册