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

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;
}

2. 字符串拼接 +=

QString str1 = "test1";
str1 += "test2";
str1 += 'A';
str1.append("test3");
qDebug() << str1;

QString str2("test4");
qDebug() << str2;

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;

其中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();

结果为

"50"
int i1 =  50
double i1 =  50
"15.6"
0
15.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();
    }

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");

结果为:

pos1 = 14
pos2 = 26
pos3 = 37
tttt : -1
在`QString`中处理中文乱码问题,你可以考虑以下几个方面: 1. 编码格式:确保你的字符串的编码格式与你的应用程序的编码格式一致。常见的编码格式包括UTF-8和GBK。你可以使用`QString`的构造函数或`fromUtf8()`函数来指定编码格式。 ```cpp QString str1 = QString::fromUtf8("中文字符串"); // 使用UTF-8编码格式 QString str2 = QString::fromLocal8Bit("中文字符串"); // 使用本地编码格式(如GBK) ``` 2. 显示设置:在显示`QString`时,确保你的UI组件(如`QLabel`、`QTextEdit`等)使用了正确的字体和字符集来显示中文字符。你可以在UI设计中设置合适的字体和字符集。 ```cpp QLabel* label = new QLabel; label->setFont(QFont("Arial", 12)); // 设置合适的字体 label->setText(str1); // 显示中文字符串 ``` 3. 文件读写:如果从文件中读取或写入`QString`时遇到乱码问题,确保使用了正确的文件编码格式来读写文件内容。你可以使用`QTextCodec`类来进行文件编码转换。 ```cpp QFile file("file.txt"); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); in.setCodec("UTF-8"); // 设置文件的编码格式 QString content = in.readAll(); file.close(); } ``` 4. 处理网络数据:如果在处理网络数据时遇到乱码问题,确保正确地将接收到的字节流转换为`QString`时指定了正确的编码格式。 ```cpp QNetworkReply* reply = manager->get(request); connect(reply, &QNetworkReply::finished, [=]() { QByteArray data = reply->readAll(); QString content = QString::fromUtf8(data); // 使用UTF-8编码格式将字节流转换为QString // 处理content }); ``` 这些是一些常见的处理中文乱码问题的方法。具体的解决方案可能因情况而异,你可以根据具体情况进行调整和尝试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值