请问怎么把带中文的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);
我好像是先转成qchar*,记不清了,有两年没写这个了
ChatGPT说:
QString str = "你好,世界!"; // 假设这是您的QString对象
// 将QString转换为UTF-8编码的const char *
const char *charStr = str.toUtf8().constData();
// 现在您可以使用charStr,确保中文字符不乱码
中文编码确实是个让人头疼的问题,我记得我之前也遇到过类似的情况,折腾了好一阵子才解决,让我来给你分享一下我的经验吧。
首先,你已经尝试了一些常见的转换方法,但似乎都没有奏效。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的编码,请确保转换逻辑与全局的编码设置兼容。
希望我的经验能对你有所帮助!
这个如果你用 char* 你必须得搞清楚字符串编码。它基本有两种可能:UTF-8 或者 GBK(对于中文来说)。当你希望在 VS 里调试时看到字符串明文时,它必须是 GBK 编码,你才能看到正常中文。写入文件时,GBK 编码不需要任何 BOM。UTF-8 理论上也不需要 BOM,但是 Windows 平台上倾向于加三个字节的 UTF-8 BOM。要么你就把字符串转换到 UTF-16 (LE) 编码 (wchar_t * 形式)。不管你在 VS 调试中看到的还是写入文件中,都不会有乱码。