QString、Qbytearray、string的相互转换及相关问题

本文详细介绍了在Qt中如何进行String和QString之间的转换,包括处理中文乱码问题的方法,以及QString与QByteArray、std::string之间的转换技巧。特别强调了在处理文本与二进制数据时应注意的事项。

String和QString之间的转化可以按照如下进行:

QString qstr;
string str;
str = qstr.toStdString();
qstr = QString::fromStdString(str);

但是这样会出现中文乱码的问题,可以按照如下进行处理:

std::string cstr; 

QString qstring; 

//从std::string 到QString 

qstring = QString(QString::fromLocal8Bit(cstr.c_str())); 

//从QString 到 std::string 

cstr = string((const char *)qstring.toLocal8Bit()); 

//不需要从gbk转到utf8 

QString value_content = QString::fromStdString(vec[i].content); 

QString value_classname = QString::fromStdString(vec[i].classname); 

QString只有在数据是文本的时候才能使用,而不是二进制的,非ASCII字符将通过QString::toAscii()被转换为'?'

QByteArray转QString需要注意的一个问题

  • QString类提供Unicode字符串。
  • QByteArray类提供存放二进制数据。
QByteArray byteArray;
byteArray += '1';
byteArray += '2';
byteArray += '\0';
byteArray += '3';
byteArray += '4';
QString str(byteArray);

 看似上面代码没问题,但实际上并不能得出我们想要的结果。
  str的内容是"12",而"\034"被剪掉了。于是找了下QString的说明文档,看到QString字符串的结尾和C风格的’\0’或0结尾相同

QbyteArray转为qstring可以用

QByteArray qbyte = filein.readAll();
QString qstr = QString::fromLatin1(qbyte, qbyte.size());

QString转换成QByteArray

1、用toLocal8Bit();

2、用toLatin1()类虽然可以转换,但是遇到中文,显示?????。

3、在QJsonDocument中如果用toLocal8Bit会出现IllegalUTF8String,用一下方法可以解决:
QJsonDocument::fromJson(byteArray.toStdString().data(), &jsonError);  

从Qt 5.4开始,通过和QByteArray建立了对std::string转换

/*之前*/
// std::string => QByteArray
QByteArray byteArray(stdString.c_str(), stdString.length());

// QByteArray => std::string
std::string stdString(byteArray.constData(), byteArray.length());


/*现在*/
inline std::string QByteArray::toStdString() const
{ return std::string(constData(), length()); }

inline QByteArray QByteArray::fromStdString(const std::string &s)
{ return QByteArray(s.data(), int(s.size())); }
<think> 在C++中,QString和std::string是两种不同的字符串类型。QString是Qt框架中提供的字符串类,而std::string是C++标准库中的字符串类。它们之间的相互转换是常见的操作,特别是在同时使用Qt和标准库的代码中。 ### 1. QString 转换为 std::string 要将QString转换为std::string,可以使用QString的成员函数`toStdString()`或`toLocal8Bit().constData()`等。推荐使用`toStdString()`,因为它直接返回一个std::string对象。 ```cpp #include <QString> #include <string> int main() { QString qstr = "Hello from QString"; // 转换为std::string std::string str = qstr.toStdString(); // 或者使用:std::string str = qstr.toUtf8().constData(); // 但toStdString()更直接 return 0; } ``` ### 2. std::string 转换QString 要将std::string转换QString,可以使用QString的构造函数,它接受const char*,因此我们可以使用std::string的c_str()方法。也可以使用`fromStdString()`静态函数。 ```cpp #include <QString> #include <string> int main() { std::string str = "Hello from std::string"; // 转换QString QString qstr = QString::fromStdString(str); // 或者使用:QString qstr = QString::fromUtf8(str.c_str()); return 0; } ``` ### 编码说明 - 当字符串包含非ASCII字符(如中文)时,需要注意编码问题。默认情况下,`toStdString()`和`fromStdString()`使用UTF-8编码。UTF-8是一种支持多字节字符的编码,能够处理各种语言字符。 - 如果你的程序运行在不同编码环境中(例如,某些Windows系统默认使用本地编码,如GBK),则需要特别注意。在跨平台开发中,通常推荐使用UTF-8编码。 ### 示例:包含中文的转换 ```cpp #include <QString> #include <string> #include <iostream> int main() { // QString 包含中文 QString qstr = "你好,Qt!"; std::string str = qstr.toStdString(); // 转换为UTF-8编码的std::string std::cout << str << std::endl; // 如果控制台支持UTF-8,将正确显示 // 从std::string转回QString QString qstr2 = QString::fromStdString(str); // 此时qstr2应与qstr相同 return 0; } ``` ### 注意事项 - 在Windows控制台直接输出UTF-8编码的字符串可能会出现乱码,因为Windows控制台默认编码可能不是UTF-8。在跨平台输出时,可能需要做额外的编码转换。 - 在Qt中,通常使用QString处理字符串,因为它内置支持Unicode,并且提供了丰富的字符串操作函数。 ### 相关编码转换函数 - `toLatin1()`:返回Latin-1 (ISO 8859-1) 编码的QByteArray。 - `toUtf8()`:返回UTF-8编码的QByteArray。 - `toLocal8Bit()`:返回本地编码(系统默认编码)的QByteArray。 因此,也可以这样转换: - QString转std::string(UTF-8):`std::string str = qstr.toUtf8().constData();` - std::stringQString(假设std::string是UTF-8):`QString qstr = QString::fromUtf8(str.c_str());` ### 总结 在大多数情况下,使用`toStdString()`和`fromStdString()`是最简单直接的方式,且默认使用UTF-8编码。如果对编码有特殊要求,可以使用其他方法。 §§相关问题§§: 1. 在C++中,如何处理不同编码的字符串转换? 2. 为什么在跨平台开发中推荐使用UTF-8编码? 3. 如果std::string包含非UTF-8编码的字符串(如GBK),如何正确转换QString? 4. 在Windows控制台输出UTF-8字符串时,如何避免乱码? </think> ### QString 与 std::string 相互转换 在 Qt 开发中,`QString`(Qt 的字符串类)和 `std::string`(C++ 标准库字符串)的相互转换是关键操作。以下是完整方法和注意事项: --- #### **1. QString → std::string** ```cpp #include <QString> #include <string> // 方法 1:使用 toStdString()(推荐) QString qstr = "Hello, Qt!"; std::string str1 = qstr.toStdString(); // 方法 2:通过 UTF-8 编码转换(处理特殊字符) std::string str2 = qstr.toUtf8().constData(); // 方法 3:使用本地编码(不推荐跨平台) std::string str3 = qstr.toLocal8Bit().constData(); ``` #### **2. std::stringQString** ```cpp #include <QString> #include <string> // 方法 1:使用 fromStdString()(推荐) std::string str = "Hello, std::string!"; QString qstr1 = QString::fromStdString(str); // 方法 2:通过 UTF-8 编码转换(处理特殊字符) QString qstr2 = QString::fromUtf8(str.c_str()); // 方法 3:使用本地编码(不推荐跨平台) QString qstr3 = QString::fromLocal8Bit(str.c_str()); ``` --- ### **关键说明** 1. **编码问题**: - Qt 默认使用 `UTF-16` 存储 `QString`,而 `std::string` 本质是字节数组。 - **推荐始终使用 UTF-8 编码**(`toUtf8()`/`fromUtf8()` 或 `toStdString()`/`fromStdString()`),避免跨平台乱码。 - 避免 `toLocal8Bit()`,它依赖系统本地编码(如 Windows 的 GBK),会导致 Mac/Linux 乱码。 2. **特殊字符处理**: ```cpp // 包含中文的转换示例 QString chineseQStr = "你好Qt"; std::string chineseStr = chineseQStr.toUtf8().constData(); // UTF-8 转换 QString restoredQStr = QString::fromUtf8(chineseStr.c_str()); // 正确还原 ``` 3. **性能注意**: - `toStdString()` 会创建临时 `std::string` 对象(有拷贝开销)。 - 高频循环中可改用 `qstr.toUtf8().constData()` 直接访问底层数据。 --- ### **何时需要显式指定编码?** 当字符串含非 ASCII 字符(如中文、emoji)且运行环境编码未知时: ```cpp // 明确指定 UTF-8 转换 std::string str = "中文测试"; QString qstr = QString::fromUtf8(str.data(), str.size()); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值