Qt编码的总结

27 篇文章 0 订阅
19 篇文章 0 订阅

在Qt4编程中,很多人往往在main文件中加上这三句话用来解决中文乱码的问题。

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

QTextCodec类提供了文本编码的转换功能。

QTextCodec::setcodecForCString()
QTextCodec::setcodecForLocale()返回了系统指定的字符集。
QtextCodec::setCodecForTr()设置tr()用到的字符集。

当我们使用QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 ) [static]这种函数时,需要将 sourceText 这个字节流转换成一个QString字符串。如果我们已经加载了翻译文件,那么Qt将把该字节流作为一个key去查找相应的翻译好的字符串。如果没有加载翻译文件呢?Qt将需要某个setCodecForLocale。

在Qt的帮助文档提到,我们应该尽可能地避免使用这些函数,在Qt5开始,setcodecForCString、setCodecForTr在Qt5中已经被删除掉了。只剩下setcodecForLocale。

// Qt默认会使用本机编码,所以对于中文系统,下面这句设置是多余的  
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));  

    QString str1("你好Hello");  
    QByteArray bLocal = str1.toLocal8Bit(); // 受setCodecForLocale影响,会转换为设定的编码。如果本机不支持指定编码,则会按toLatin1处理  
    QByteArray baLatin1 = str1.toLatin1();  // 不受setCodecForLocale影响,强制转换为ISO-8859-1编码  
    QByteArray bUtf8 = str1.toUtf8();       // 不受setCodecForLocale影响,强制转换为UTF-8编码  
    qDebug() << str1;                       // 正常,Qt会将UTF-16转换为UTF-8输出  
    qDebug() << baLatin1;                   // 乱码,用UTF-8编码输出Latin1字节流  
    qDebug() << bLocal;                     // 乱码,用UTF-8编码输出GBK字节流  
    qDebug() << bUtf8;                      // 正常,用UTF-8编码输出UTF-8字节流  

    QString str2 = QString::fromLocal8Bit(bLocal);  
    qDebug() << str2;                       // 正常,因为上面显式指定字节流来自本机编码,而bLocal正是本机编码GBK  

    str2 = QString::fromLatin1(bLocal);  
    qDebug() << str2;                       // 乱码,bLocal是GBK编码,但却指定了以Latin1方式去读取,肯定会乱码  

    // 字节流来自UTF-8  
    str2 = QString::fromUtf8("\xE4\xBD\xA0\xE5\xA5\xBD\x48\x65\x6C\x6C\x6F");  
    qDebug() << str2;                       // 正常  

    // Qt默认采用UTF-8处理字符串,所以不用显式地去调用fromUtf8  
    str2 = QString("\xE4\xBD\xA0\xE5\xA5\xBD\x48\x65\x6C\x6C\x6F");  
    qDebug() << str2;                       // 正常  

在Qt中,QString会用UTF-16编码存储,而qDebug()等I/O函数会以UTF-8编码处理。
其实转换后的字节流是正确的,只是显示时用了和字节流不同的编码方式处理导致乱码
所以当要在Qt中输入输出非UTF-8字符串时应该先转换一下

在源码中要写入非英文字符的话建议使用转义的方式,也就是上面“\xE4\xBD…”这种,这也是官方推荐的方式

参考:
http://blog.csdn.net/aqtata/article/details/9184741

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值