zoukankan      html  css  js  c++  java
  • day02 QT学习 字符集和中文乱码的问题

    字符集

    ASCII的7位字符集一共128个字符,标准ASCII中最高位(b7)用作奇偶校验,如果第一位不用,则会把第一位丢失。

    ISO-8859-1 扩展ASCII,用128-255存储拉丁字符,这样基本西方国家的字符集已经能够使用。

    ANSI标准 美国国家标准学会

    定义了多字节字符集(MBCS,Multi-ByteChactacter Set),0-127之间的字符,依旧是1个字节代表1个字符,2个字节表示1个字符。

    以多字节字符集为基础,建立了GB2312 GBK编码

    GB2312,GBK仍然是ANSI编码,两个大于127的字符表示一个汉字,GB2312可以表示6763常用汉字。GBK编码是GB2312的扩展汉字,可以表示21003个汉字。

    UTF编码方式,是一个变长的编码方式,单字节与ASCII码相同。对于n字节的符号(n>1),首字节前n位为1,n+1为0,后面字节前两位都为10。

    UTF-8长度1-4个字节

    UTF-16 长度 2或4个字节

    UTF-32 长度 4个字节

    QT编程下,QString内部使用UTF-16存储。而默认情况下,中文编码下是GB2312/GBK。

     

    字节序BOM

    LE,小端,低位存储在低地址。

    BE,大端,高位存储在低地址。

    BOM字节序标志头,文本头

    FE FF 表示BE,即大端

    FF FE 表示LE,即小端  

    QString

    QString 内部使用16-bitQChars ushort Unicode4.0来存储字符串。当你使用非QT内部的接口来操作字符串时,需要注意编码的转换。

    QString 封装了字符串处理功能。

    空判断 ==”” isNull isEmpty

    字符串拼接 +=

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

    例如   /*格式化*/

        QString ssr;

        ssr = QString("name=%1 %2 %3 %4 %5")

                .arg("xiaoming")

                .arg(15)

                .arg(14.5)

                .arg(123,0,2)

                .arg(255,8,16);

        qDebug() << ssr;

    同时QSting的查找替换是支持正则表达式的。

    QT中文乱码的问题

    默认字符集设置,与数据源或者代码不一致。

    QT字符集设置:

    codec = QTextCodec::codecForName(“UTF-8”);

    QTextCodec::setCodecForLocale(codec);

    QTextCodec::availableCodecs();

    设置编码集后只会影响QString::fromlocal8bit和tolocal8bit

    如下:

        char *src = "元数据中文GBK";

        //元数据是gbk或者gb2312 多字节存入QString

        //本地编码方式 默认GBK

        QString str1 = QString::fromLocal8Bit(src);

        qDebug() << str1;

     

        //把QString转换为gbk,输出

        cout << str1.toLocal8Bit().toStdString() << endl;

     

        //设置本地编码格式,将原来

        QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

        QString str2 = QString::fromLocal8Bit(str1.toUtf8());

        //等价于 QString str2 = QString::fromLocal8Bit(str1.toStdString().c_str());

     

        //windows 下使用QString作为参数

        MessageBox(0, str2.toStdWString().c_str(), L"中文标题q", 0);

    源码文件字符集格式(VS 和 qtCreator不同设置)。

    QtCreator编码字符集设置:工具->选项->文本编辑器->行为

    VS中可以将文件另存为为UTF编码,或者加入

    #pragma execution_character_set("UTF-8"),用代码声明编码格式。

    注意,如果此时文件编码已经是UTF了,如果再次使用以上的#pragma语法,这将会再次导致乱码。

    如果在vs project属性下设置字符集,目前来看没有用。

    字符集转换宏函数QStringLiteral,将多字节转换为UTF。

  • 相关阅读:
    python——简单的爬虫
    Python——文件读取与写入
    python—列表集合的交集并集差集
    python—turtle佩奇
    python——append用法
    python——列表平均数
    python回文数的判断
    python输入两个数字比较大小
    python———input()函数
    HTML---3
  • 原文地址:https://www.cnblogs.com/merlinzjl/p/11391860.html
Copyright © 2011-2022 走看看