• 05.QString字符串处理及中文乱码问题处理


    一、gbk_utf_ansi_asc字符集分析字节序

    字符集

    • ASCII的7位字符集128个字符
    • 标准ASCII中最高位(b7)用作奇偶校验1个数
    • ISO-8859-1扩展ASCII 128-255拉丁文

    ANSI标准

    • AmericanNational Standards Institute美国国家标准学会
    • 多字节字符集(MBCS, Multi-ByteCharacter Set)
    • 0到127之间的字符,依旧是1个字节代表1个字符
    • 2个字节来表示1个字符

    GB2312 GBK编码

    • ANSI编码6763常用汉字
    • 两个大于127的字符表示一个汉字
    • GBK编码GB2312的扩展汉字21003个

    UTF-8

    • 变长的编码方式
    • 单字节与ASCII码相同
    • 对于n字节的符号(n > 1),首字节前n位为1,n+1为0,后面字节前两位都为10
    1字节 0xxx xxxx
    2字节 110x xxxx 10xx xxxx
    3字节 1110 xxxx 10xx xxxx 10xx xxxx
    4字节 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
    
    • 1
    • 2
    • 3
    • 4

    UTF-16和UTF-32

    • UTF-16(两个字节或四个字节)
    • UTF-32(四个字节)

    字节序BOM

    • LE(little endian):小字节字节序 低位在前
      0x00 1A23 23 1A 00
    • BE(big endian):大字节字节序
    • BOM字节序标志头
      文本头FE FF是BE
      文本头FF FE是LE

    二、QString项目创建空和NULL判断

    QString

    • 16-bit QChars ushort Unicode 4.0
    • 封装了字符串处理功能

    QString常用功能
    1. 空判断 == “” 是等于 isNull + isEmpty

    QString abc = "";
    if(abc == "")
    {
       qDebug() <<"abc is null" << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 字符串拼接 +=

    QString str1 = "test1";
    str1 += "test2";
    str1 += 'A';
    str1.append("test3");
    qDebug() << str1;
    
    QString str2("test4");
    qDebug() << str2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 格式化字符串 %1 %2 arg()

        QString str1;
        str1 = QString("name = %1, age = %2, %3,%4, %5")
               .arg("liming")
               .arg(15)
               .arg(14.5)
               .arg(123, 0, 2)
               .arg(255, 0, 16);
        qDebug() << str1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其中arg(123, 0, 2)中,
    123为显示数值;
    0为显示位数,如果设置值小于应该显示的位数,则全部显示,如果大于应该显示位数,则前面补空格;
    2为二进制,可以设置2进制、8进制、16进制等等;

        QString num1 = QString::number(50);
        qDebug() << num1;
        int i1 = num1.toInt();
        qDebug() << "int i1 = " << i1;
        qDebug() << "double i1 = " << num1.toDouble();
    
        QString num2 = QString::number(15.6);
        qDebug() << num2;
        qDebug() << num2.toInt();
        qDebug() << num2.toDouble();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果为

    "50"
    int i1 =  50
    double i1 =  50
    "15.6"
    0
    15.6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意: double转int时值为0

    4.遍历字符串

        QString str = "xcjasd,asdasd,[name],[id],[name],asda[name]sdsa";
        for (int var = 0; var < str.size(); ++var) {
            cout << str[var].toLatin1();
        }
        cout << endl;
        cout << "===========================" << endl;
        QString::iterator iter = str.begin();
        for (; iter != str.end(); ++iter)
        {
    //        cout << iter->toLatin1();
            cout << (*iter).toLatin1();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5.字符串查找

        QString str = "xcjasd,asdasd,[name],[id],[name],asda[name]sdsa";
        
        QString key = "[name]";
        int pos1 = str.indexOf(key);
        cout << "pos1 = " << pos1 << endl;
        int pos2 = str.indexOf(key, pos1 + key.size());
        cout << "pos2 = " << pos2 << endl;
        int pos3 = str.indexOf(key, pos2 + key.size());
        cout << "pos3 = " << pos3 << endl;
    
        cout << "tttt : " << str.indexOf("tttt");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果为:

    pos1 = 14
    pos2 = 26
    pos3 = 37
    tttt : -1
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解
    react跨域如何解决?
    npm切换镜像源
    spring_注解笔记
    做自媒体一个重要的问题就是:自己的定位是什么?
    高压放大器能够在哪里使用呢
    AI歌手:新晋挑战者还是未来主流的替代者?
    java Boolean 比较
    测开 - 自动化测试 selenium - 自动化概念 && 测试环境配置 - 细节狂魔
    机器学习8:在病马数据集上进行算法比较(ROC曲线与AUC)
  • 原文地址:https://blog.csdn.net/zzyzxb/article/details/133190309