std::string

c++标准库中提供了std::string这个字符串类,但功能真心不够用,比如简单的字符串和整型转换,还得借助atoi,itoa等c字符串函数,和浮点型相互转换更是没有。

string并不是一个单独的容器,只是basic_string 模板类的一个typedef 而已,相对应的还有wstring, 在string 头文件定义如下:

extern "C++" {
typedef basic_string <char> string;
typedef basic_string <wchar_t> wstring;
} // extern "C++"

string 其实相当于一个保存字符的序列容器,因此除了有字符串的一些常用操作以外,还包含了序列容器的操作。字符串的常用操作包括:增加、删除、修改、查找、比较、连接、输入、输出等。

string不是我们今天的主角,下面仅附上string的函数列表,以做对比:

begin 得到指向字符串开头的Iterator
end 得到指向字符串结尾的Iterator
rbegin 得到指向反向字符串开头的Iterator
rend 得到指向反向字符串结尾的Iterator
size 得到字符串的大小
length 和size函数功能相同
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下,字符串可能的大小
empty 判断是否为空
operator[] 取第几个元素,相当于数组
c_str 取得C风格的const char* 字符串
data 取得字符串内容地址
operator= 赋值操作符
reserve 预留空间
swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
operator+= += 操作符
erase 删除字符串
clear 清空字符容器中所有内容
resize 重新分配空间
assign 和赋值操作符一样
replace 替代
copy 字符串到空间
find 查找
rfind 反向查找
find_first_of 查找包含子串中的任何字符,返回第一个位置
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置
find_last_of 查找包含子串中的任何字符,返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置
substr 得到字串
compare 比较字符串
operator+ 字符串链接
operator== 判断是否相等
operator!= 判断是否不等于
operator< 判断是否小于
operator>> 从输入流中读入字符串
operator<< 字符串写入输出流
getline 从输入流中读入一行

那么我们今天的主角就是QString,实际上Qt中提供了QLatin1String和QString两种字符串类。

QLatin1String

QLatin1String对US-ASCII/Latin-1八位字符串编码提供了一个轻量级的包裹,使用示例如下:

QLatin1String str("Hello");
qDebug("%d", str.size());
qDebug(str.data());

运行结果打印:5 Hello
size返回字符串长度,data返回字符串指针,除此外仅提供了几个比较操作运算符,使用意义不大。

QString

QString以16位Unicode编码保存字符串,功能齐全。

这里先简单介绍下ASCII、Unicode、UTF-8各字符编码的意义:

因为最早的计算机只输入输出字母,数字,几个常用符号,8位可以表示256个字符编码,所以足够了,但随着计算机的发展,世界上的语言这么多,256远远不够用,各国的编码标准亦各不相同,所以产生了Unicode编码,Unicode编码使用2个字节存储一个字符,理论上可以表示65535个字符,但考虑这么一种情况,文本中大量是字母,只有少量中文,那么使用Unicode编码所占的内存将是纯ASCII的两倍,所以UTF-8编码应运而生了,UTF-8编码中将原先ASCII字符依旧仅使用1个字符表示,中文因为标识位的占用,可能占用2-3个字节,但对于仅有少量中文的文本来说,使用UTF-8编码还是大大节省了存储空间,并且更适合网络传输,所以html等文档都默认使用UTF-8编码格式。

那么QString还是选择以Unicode来存储字符串,即能存储中文,2个字节的方式也比UTF-8不定字节的方式方便处理。但它提供了各种编码格式转换函数:

  • toLatin1() returns a Latin-1 (ISO 8859-1) encoded 8-bit string.
  • toUtf8() returns a UTF-8 encoded 8-bit string. UTF-8 is a superset of US-ASCII (ANSI X3.4-1986) that supports the entire Unicode character set through multibyte sequences.
  • toLocal8Bit() returns an 8-bit string using the system’s local encoding.

构造

QString的构造函数相当多

QString()

QString(const QChar *unicode, int size = -1)

QString(QChar ch)

QString(int size, QChar ch)

QString(QLatin1String str)

QString(const QString &other)

QString(QString &&other)

QString(const char *str)

QString(const QByteArray &ba)

接受QChar、QLatin1String 、QString、QByteArray、const char*的输入

遍历

QString提供了索引和迭代器的遍历方式:

QString str = "Hello";
for (int i = 0; i < str.size(); ++i){
    qDebug() << str[i];
}

for (QChar* iter = str.begin(); iter != str.end(); ++iter){
    qDebug() << *iter;
}

插入

QString提供了prepend、append、push_front、push_back、insert用于插入字符串

QString str = "a ";
str.prepend("provides ");
str.push_front("QString ");
str.append("character ");
str.push_back("string");
str.insert(strlen("QString "),"class ");
str += ".";
qDebug() << str;

查找

QString提供了startswith,endswith,contains用于判断头、尾、任意位置是否存在指定字符串

QString str = "http://blog.csdn.net";
if (!str.startsWith("http://")){
    str.prepend("http://");
}
if (!str.endsWith("/")){
    str.append("/");
}
if (str.contains("blog")){
    qDebug() << str;
}

替换

QString str = "2017/10/24";
str.replace("/", "-");
qDebug() << str;

转换

QString str = "-12";
qDebug() << str.toInt();

str = "FF";
bool ok;
qDebug() << str.toInt(&ok, 16);

str = "3.1415926";
qDebug() << str.toFloat();

str = "AbCdEfG";
qDebug() << str.toUpper();
qDebug() << str.toLower();

QString plain = "#include <QtCore>"
QString html = plain.toHtmlEscaped();
// html == "#include &lt;QtCore&gt;"

分割

QString str = "Qt is a GUI application framework.";
QStringList ret = str.split(" ");
qDebug() << ret;

比较

QString key = "Width";
QString value = "1080";
if (key == "width"){
    int w = value.toInt();
    qDebug() << key;
}

if (QString::compare(key, "width", Qt::CaseInsensitive) == 0){
    qDebug() << value;
}

默认是对大小写敏感的。

输入

QString str1 = QString::asprintf("%d、%s", 1, "first");
QString str2 = QString("%1、%2").arg(2).arg("second");
qDebug() << str1;
qDebug() << str2;

QString提供的arg方法异常灵活,具体可参看Qt帮助文档

输出

输出主要是转换为char*型

QString str = "Hello";
qDebug() << str;
qDebug(str.toLocal8Bit().data());
qDebug(qPrintable(str));

QString str = "Hello,中文";
qDebug() << str;
qDebug(str.toUtf8().data());
qDebug(qUtf8Printable(str));
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐