QT--知识点(编码、中文乱码)

1、QTextCodec类,该类主要是提供字符串的编码格式切换,主要函数有以下三个:

a、QTextCodec::codecForName("xxx") 表示创建一个编码格式为xxx的编解码器,返回一个QTextCodec对象,怎么用呢?比如说我们已知文本的格式为utf-8,但是由于QT以Unicode格式存储,所以需要将utf-8转换为Unicode,那么首先我们第一步要做的就是,创建一个utf-8的编码器。

b、toUnicode("xxx"),将xxx字符串通过先前创建的编码器转换成Unicode格式,这里需要注意一个东西,xxx的字符串的格式需要和创建的编码器格式一样,如果是从文件中读取的字符串需要先判断好是什么格式。如果不是文件中读的,类QByteArray可以当做任意编码格式,QString不行,可以试试,根据是否乱码来判断。

c、fromUnicode("xxx"),将xxx字符串由Unicode格式转成先前创建的编码器编码格式,这里XXX肯定是Unicode格式了。

通过这个类,就可以转换任意编码了,比如ANSI转utf-8,可以先ANSI转Unicode,再Unicode转utf-8

补充:QTextCodec还有个静态函数QTextCodec::setCodecForLocale(),表示为当前设置一个默认的编码格式,这个好像没啥效果,没有解决我的乱码问题,想要解决乱码问题,接着往下看。

一般乱码出现在打印中文乱码,读写文件含中文时乱码,首先解释下什么是乱码,乱码是因为当前的编码格式和目标内容格式不一样,

情景1:比如说现在定义个字符串QSting str = "测试",我直接去打印它,肯定会乱码,需要在code开头位置加上#pragma execution_character_set("utf-8")这样一句话,为字符串指定一个编码格式,这样去打印的时候,系统就会以utf-8的编码格式去打印它,就不会出现乱码

情景2:读取一个1.txt的内容,里面含有中文,并且它的编码格式为ANSI,现在去用QFile打开它,然后用QTextStream去获取内容,肯定会乱码,或者是用utf-8编码格式去读,也是乱码

情景3:创建一个文件1.txt,并写入一段中文,如果不加#pragma execution_character_set("utf-8")这个,打印出来的肯定是乱码,你再去写入,肯定也还会乱码。

对于情景2 3,QTextStream有一个setCodec函数,读文件出现乱码的时候,设定这个编码格式为文件实际格式,写文件出现乱码的时候,设这个为utf-8,一般写加了那个就不会出现乱码了。

ps:有些小伙伴肯定会疑问,读文件的时候,我怎么通过程式去判断是什么格式编码呢?还有写文件的时候,生成文件的编码格式是什么呢?先回答后面那个问题,生成文件的格式和你们写入的字符串用的格式有关,你设的ANSI就是ANSI,设的utf-8就是utf-8,下面这个函数用来识别文件编码格式

//检查文件编码 0=ANSI 1=UTF-16LE 2=UTF-16BE 3=UTF-8 4=UTF-8BOM

int findCode(const QString &fileName)
{
    //假设默认编码utf8
    int code = 3;
    QFile file(fileName);
    if (file.open(QIODevice::ReadOnly)) {
        //读取3字节用于判断
        QByteArray buffer = file.read(3);
        quint8 b1 = buffer.at(0);
        quint8 b2 = buffer.at(1);
        quint8 b3 = buffer.at(2);
        if (b1 == 0xFF && b2 == 0xFE) {
            code = 1;
        } else if (b1 == 0xFE && b2 == 0xFF) {
            code = 2;
        } else if (b1 == 0xEF && b2 == 0xBB && b3 == 0xBF) {
            code = 4;
        } else {
            //尝试用utf8转换,如果可用字符数大于0,则表示是ansi编码
            QTextCodec::ConverterState state;
            QTextCodec *codec = QTextCodec::codecForName("utf-8");//创建一个utf-8的编码器
            codec->toUnicode(buffer.constData(), buffer.size(), &state);//看能不能全转换成Unicode,全转换说明buffer就是utf-8的格式,否则不会转换成功。
            if (state.invalidChars > 0) {
                code = 0;
            }
        }

        file.close();
    }

    return code;
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值