- Qt中字符串常用的类型
类型 | 介绍 |
---|---|
QString | QString想当于std中的string,在使用时不用像char *那样担心会超出范围或者漏写一个’\0’,这一切的工作C++会帮你处理好。你只需要正确使用Qt中提供的各种方法、函数接口即可。 |
QByteArray | 字面意思,字节数组,就比如使用char [];不同的是QByteArray返回大小时,不会考虑到最终’\0’的一个字节大小 |
QString、QByteArray、中文编码
一、QString用法
~···
QString具体用法参考:https://blog.youkuaiyun.com/yc__coder/article/details/107261092
~···
二、QByteArray用法
1、简介
字节数组,主要存放二进制数组。它与char []相同,但是更容易使用。和QString同级。
2、基本函数
.data()
QByteArray array("helloooo");
char * data = array.data();
qDebug() << data; //helloooo
输出helloooo
,注意⚠️这里是没有双引号的。
因为这里直接就当作是一个 data[] 数组来处理了。
.fill()
QByteArray array("helloooo");
array = array.fill('c'); //按照当前大小全部改为c
qDebug() << array; //"cccccccc"
QByteArray array("helloooo");
array = array.fill('c',3); //改三个字符为c,其余的全部删除
qDebug() << array; //"ccc"
QByteArray::fill(char c, int size = -1)
是原型,所以默认是-1,也就是默认大小不改变,否则大小改成指定大小,这个函数和QString::fill
功能相同。
.indexOf()
QByteArray array("hellooolo");
int flag = array.indexOf('l');
std::cout << flag << std::endl; //2
QByteArray array("hellooolo");
int flag = array.indexOf('l',4);
std::cout << flag << std::endl; //7
QByteArray::indexOf(char c, int from = 0)
原型,后面的from是指从第几索引开始计算。 默认是0,也就是第一个字符开始。
.isEmpty() && .isNull()
QByteArray array;
qDebug() << array.isNull() << array.isEmpty(); //true true
QByteArray array("");
qDebug() << array.isNull() << array.isEmpty(); //false true
当isEmpty
为true时,isNull
肯定为true,这和QString也是一样的。
::number()
qDebug() << QByteArray::number(2020); //"2020"
用法和QString相同,原型为QByteArray::number(int , int base = 10)
整形,配上进制数,默认为十进制,范围在 [2, 36]。
.toDouble() && .toFloat() && .toInt()
QByteArray array("2020.3232323");
std::cout << array.toDouble() << std::endl; //2020.32
QByteArray array("2020.3232323");
std::cout << array.toFloat() << std::endl; //2020.32
QByteArray array("2020.3232323");
std::cout << array.toInt() << std::endl; //0
QByteArray array("2020");
std::cout << array.toInt() << std::endl; //2020
.setNum()
QByteArray array;
array.setNum(2020);
qDebug() << array; //"2020"
具体不阐述,原型QByteArray::setNum(int , int base = 10)
.size()
QByteArray array("helloooo");
std::cout << array.size() << std::endl; //8
不解释
三、中文编码
引言
QString对字符串使用unicode编码。
unicode编码:具体参考网页 Unicode_百度百科
Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
举例感知编码方式差异
- 例一
QString str("先挣一个亿");
qDebug() << str;
qDebug() << str.toUtf8();
qDebug() << str.toLatin1();
qDebug() << str.toLocal8Bit();
qDebug() << str.unicode();
输出如下
"先挣一个亿"
"\xE5\x85\x88\xE6\x8C\xA3\xE4\xB8\x80\xE4\xB8\xAA\xE4\xBA\xBF"
"?????"
"\xE5\x85\x88\xE6\x8C\xA3\xE4\xB8\x80\xE4\xB8\xAA\xE4\xBA\xBF"
0x7fabb370e338
在编译时,进程将汉字直接存储到str中,没有进行编码工作;如果直接读取str也是不进行编码工作的,所以进去什么样出来也就什么样。可以想象,在执行构造函数时,QString将汉字变为遗传二进制保存,在读取str时也是将这串二进制解读,但是如果调用编码方式,反而会改变原序列,那么就容易出现乱码。
再看下一例子。
- 例二
QString str = QString::fromLatin1("先挣一个亿");
std::cout << str.data() << std::endl;
std::cout << str.toUtf8().data() << std::endl;
std::cout << str.toLatin1().data() << std::endl;
std::cout << str.toLocal8Bit().data() << std::endl;
std::cout << str.unicode() << std::endl;
输出
0x7fec685093f8
å
ˆæŒ£ä¸€ä¸ªäº¿
先挣一个亿
å
ˆæŒ£ä¸€ä¸ªäº¿
0x7fec685093f8
将str保存为Latin编码方式,输出时在再转码。