1、QByteArray介绍
Qt中对字符处理已经有QString,为什么还要引出QByteArray,因为QString中一个字符占两个字节,而传统的标准C/C++中Char/String都是一个字节为单位,而Qt库中是无缝兼容标准C/C++语法的,而在实际使用中,多机通信、交换数据等等都是使用QByteArray,这样才能达到跨平台,跨语言,跨设备,特别是嵌入式设备,大多采用C语言编程,自然是标准C库,Qt想与之通信就必须使用QByteArray,可以省去诸多转换麻烦。
QByteArray 类可以处理以 ‘\0’ 结尾的传统字符串,包括 UTF-8 编码和其他如 GBK、Big5 等多字节编码的字符串,在作为字符串使用时,QByteArray 内部字符编码格式是不限定的,可以是任意编码的,所以程序员自己必须要事先确定程序会用到哪些编码的 QByteArray 。因为 Qt5 源文件规定是 UTF-8 编码的,所以 QBtoLatin1();yteArray 内部使用 UTF-8 编码的字符串居多。QByteArray 在赋值、传参数、返回值时也是使用隐式共享机制提高运行效率,只有字符串发生修改时才会执行深拷贝。
2、类型转换实现跨语言
2.1 QByteArray与QString互转
QString转QByteArray:
QString:: toLocal8Bit(); | toLatin1(); | toUtf8();
QString str("hello world");
QByteArray data = str.toLocal8Bit();
QByteArray data = str.toLatin1();
QByteArray data = str.toUtf8();
//不能说完全一样,只能说完全相同,结果是一样的,其中异同在此就不深究了,学会的有兴趣可以深入研究一下,毕竟面向百度
QByteArray转QString:
没啥说的,QString构造函数中有一个重载可以是可以直接通过QByteArray进行构造的
QByteArray qStr = "hello world";
QString str(qStr);
2.2 QByteArray与char*互转####
QByteArray转char*:
char *ch;//不要定义成ch[n];
QByteArray byte;
ch = byte.data();
char*转QByteArray:
char *ch;
QByteArray byte;
byte = QByteArray(ch);
3、合理使用QByteArray和QString解决字符编码问题
因为 QByteArray 既可以用作字符串,又可以用作字符数组,它的使用方式比较多。而且作为字符串时,它内部的字符编码格式又是不固定的,所以 QByteArray 有诸多的不确定性。Qt 帮助文档里面明确说了,如果要做字符串方面的处理,都应当使用 QString ,除非是嵌入式系统里面内存有限,不得不用 QByteArray 的情况。对于本地化编码的字符串,可以用 QString::fromLocal8Bit 函数将字符串源转为 QString 对象;对于 UTF-8 编码的字符串,可以用 QString::fromUtf8 函数实现转换。如果要反过来转换,就 用对应的 to*** 函数。通常情况下有这些函数就够用了。
对于文件读写和网络数据收发,这些一般都是用 QByteArray 对象作为输入输出缓冲区,并且可以利用 QDataStream 做串行化,将多个数据打包成 QByteArray 。通常情况下,对于纯字节数据的处理使用 QByteArray 。
在有些情况下,需要 QString 和 QByteArray 对多种编码格式字符串进行转换,需要二者协作,下面给个协作的示例:
void TestCooperation()
{
//源字符串
QString strSrc = QObject::tr("1234abcd 千秋萬載 壹統江湖");
//转为 UTF-8
qDebug()<<strSrc.toUtf8();
//明确地转为 GB18030
QTextCodec *codecGB = QTextCodec::codecForName("GB18030");
QByteArray strGB = codecGB->fromUnicode(strSrc); //转为GB18030
qDebug()<<strGB;
qDebug()<<codecGB->toUnicode(strGB); //转回QString
//明确地转为 Big5
QTextCodec *codecBig5 = QTextCodec::codecForName("Big5");
QByteArray strBig5 = codecBig5->fromUnicode(strSrc); //转为Big5
qDebug()<<strBig5;
qDebug()<<codecBig5->toUnicode(strBig5); //转回QString
}