QT5.14.2版本中QString、QByteArray以及中文编码

  • Qt中字符串常用的类型
类型介绍
QStringQString想当于std中的string,在使用时不用像char *那样担心会超出范围或者漏写一个’\0’,这一切的工作C++会帮你处理好。你只需要正确使用Qt中提供的各种方法、函数接口即可。
QByteArray字面意思,字节数组,就比如使用char [];不同的是QByteArray返回大小时,不会考虑到最终’\0’的一个字节大小

一、QString用法

~···

QString具体用法参考:https://blog.csdn.net/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都是将数字转换到程序数据的编码方案。

举例感知编码方式差异

  1. 例一
    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时也是将这串二进制解读,但是如果调用编码方式,反而会改变原序列,那么就容易出现乱码。

再看下一例子。

  1. 例二
    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编码方式,输出时在再转码。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值