merlinzjl

导航

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。

posted on 2019-08-21 23:10  merlinzjl  阅读(689)  评论(0编辑  收藏  举报