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。