QByteArray 类作为字符串使用时,它会自动在字符串末尾添加 '\0' ,末尾的 '\0' 不计入字符串长度。QByteArray 字符串的内部编码是不固定的,比如前面 QString 的 toLocal8Bit 和 toUtf8 函数返回的对象全是 QByteArray 类型。QByteArray 字符串的数据来源可能有:
- ①源代码里的字符串,这时 QByteArray 内码与源文件的编码有关,UTF-8 编码源文件生成的很可能就是 UTF-8 编码的字符串。
- ②本地文本文件,从文件读取的字符串与该文件使用的字符编码有关,Linux 上常用 UTF-8,而 Windows 经常使用 ANSI 多字节编码,简体 Windows 系统一般是 GBK,而繁体默认是 Big5。
- ③网页数据,网页本身也是文本文件,有它自己的文本编码格式,这时网页文件编码格式决定 QByteArray 字符串的编码格式。
我们这里示范的是第一种,全部用 UTF-8 编码的 QByteArray 字符串。QByteArray 类关于字符串处理的成员函数基本和 QString 类的一样,函数名和参数都是类似的。但注意因为 QByteArray 内码不确定,它没有 arg 函数,也没有字符编码转换的函数。QByteArray 关于字符串处理的函数就不枚举了,和上一节 QString 的差不多,下面直接看示例代码:
void Str() //内码 UTF-8标签:编码,QByteArray,函数,字符串,qDebug,UTF From: https://blog.51cto.com/u_15515702/6052207
{
//数值与字符串转换
int nDec = 800;
QByteArray basDec;
basDec.setNum(nDec); //数值转字符串
qDebug()<<basDec;
QByteArray basReal = "125.78999";
double dblReal = basReal.toDouble(); //字符串转数值
qDebug()<<fixed<<dblReal;
//运算符
QByteArray basABCD = "ABCD";
QByteArray basXYZ = "XYZ";
qDebug()<<(basABCD < basXYZ); //二者字符编码一致才能比较!
qDebug()<<(basABCD == basXYZ);
qDebug()<<(basABCD >= basXYZ);
qDebug()<<(basABCD + basXYZ);
//子串处理
QByteArray basHanzi = "1234打印汉字";
//作为字符串时 QByteArray::length() 和 qstrlen() 一致
qDebug()<<basHanzi.length()<<"\t"<<qstrlen( basHanzi.data() );
//重复
QByteArray basMoreHanzi = basHanzi.repeated(2);
qDebug()<<basMoreHanzi.count("1234"); //统计次数
qDebug()<<basMoreHanzi.startsWith("1234"); //开头判断
qDebug()<<basMoreHanzi.endsWith("汉字"); //结尾判断
qDebug()<<basMoreHanzi.indexOf("1234"); //从左边查出现位置
qDebug()<<basMoreHanzi.lastIndexOf("1234"); //从右边查出现位置
//替换
basMoreHanzi.replace("1234", "一二三四");
qDebug()<<basMoreHanzi;
//切割字符串
QByteArray basComplexFile = " /home/user/somefile.txt \t\t ";
QByteArray basFileName = basComplexFile.trimmed(); //剔除两端空白
qDebug()<<basFileName;
//分隔得到新的 QByteArray 对象列表
QList<QByteArray> baList = basFileName.split('/');
//打印
for(int i=0; i<baList.length(); i++)
{
qDebug()<<i<<"\t"<<baList[i];
}
//没有段落函数
}