C语言字符串类是以“\0”为结尾的字符数据进行表示;C++字符串是用类std::string进行表示。而Qt提供了一个更为强大的QString类。其能够实现编程过程中需要的大多数字符串操作。QString存储了一个16bit 的 QChar 数字,每个 QChar 对应一个 Unicode 4.0 字符。
Unicode 是一种国际标准,支持当今使用的大多数书写系统。它是 US-ASCII (ANSI X3.4-1986) 和 Latin-1 (ISO 8859-1) 的超集,所有 US-ASCII/Latin-1 字符都位于相同的代码位置。
在后台,QString 使用隐式共享(写入时复制)来减少内存使用并避免不必要的数据复制。这也有助于减少存储 16 位字符而不是 8 位字符的固有开销。
除了QString,Qt还提供了QByteArray类来存储原始字节和传统的8位“0”终止字符串。在大多数情况下,QString 是您想要使用的类。它在整个Qt API中使用,Unicode支持确保您的应用程序易于翻译,如果您想在某个时候扩展应用程序市场。QByteArray 适合的两种主要情况是需要存储原始二进制数据以及内存保护时(如在嵌入式系统中)至关重要。
1、字符串操作类
QString 初始化:
一种初始化方式,是向QString构造函数中传入一个const char*数组。例如:
QString str = "Hello World";
QString 可以通过 fromUtf8()函数将 const char* 数组转换为 Unicode。
在所有采用 const char * 参数的 QString 函数中,const char * 被解释为以 UTF-8 编码的经典 C 样式 '\0' 结尾字符串。常量字符 * 参数为 0 是合法的。
另一种方式,是向QString 数组传入一个 QChar数组,例如:
static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };
QString str(data, 4);
QString 会制作 QChar 数据的深层拷贝,因此您可以稍后对其进行修改而不会遇到副作用。(如果出于性能原因,您不想创建字符数据的深层副本,请改用 QString::fromRawData() 。
另一种方法是使用 resize() 设置字符串的大小,并初始化每个字符的数据字符。QString 使用从 0 开始的索引,就像C++数组一样。要访问特定索引位置的字符,可以使用运算符 []()。在非常量字符串上,operator[]() 返回对可在赋值左侧使用的字符的引用。例如:
QString str;
str.resize(4);
str[0] = QChar('U');
str[1] = QChar('n');
str[2] = QChar(0x10e3);
str[3] = QChar(0x03a3);
对于只读访问,可以使用at()函数:
QString str="abcdefgh";
for (int i = 0; i < str.size(); ++i) {
if (str.at(i) >= QChar('a') && str.at(i) <= QChar('f'))
qDebug() << "Found character in range [a-f]";
}
at() 函数可能比 operator[]() 更快,因为它从不会导致发生深层复制。或者,使用 left()、right() 或 mid() 函数一次提取多个字符。QString 可以嵌入'\0'字符 (QChar::Null)。size() 函数始终返回整个字符串的大小,包括嵌入的“0”字符。调用 resize() 函数后,新分配的字符具有未定义的值。要将字符串中的所有字符设置为特定值,请使用 fill() 函数。QString 提供了数十种重载,旨在简化字符串的使用。例如,如果要将 QString 与字符串文本进行比较,则可以编写如下代码:
QString str="auto";
if (str == "auto" || str == "extern"
|| str == "static" || str == "register") {
// ...
}
还可以将字符串文本传递给将 QStrings 作为参数的函数,调用 QString(const char *) 构造函数。类似地,您可以使用 qPrintable() 宏将 QString 传递给采用 const char * 参数的函数,该宏将给定的 QString 作为 const char * 返回。这相当于调用 <QString>.toLocal8Bit().constData()。
后续公众号会发布系列教程,更多内容请关注公众号:程序猿学习日记