zoukankan      html  css  js  c++  java
  • 从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式(在源码里写非英文,官方推荐“xE4xBD...”这种)good

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));  
    2. QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));  
    3. QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));  


    网上很多人一碰到编码问题就无脑的Copy上面3行……
    从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. {  
    2.     // Qt默认会使用本机编码,所以对于中文系统,下面这句设置是多余的  
    3.     QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));  
    4.   
    5.     QString str1("你好Hello");  
    6.     QByteArray bLocal = str1.toLocal8Bit(); // 受setCodecForLocale影响,会转换为设定的编码。如果本机不支持指定编码,则会按toLatin1处理  
    7.     QByteArray baLatin1 = str1.toLatin1();  // 不受setCodecForLocale影响,强制转换为ISO-8859-1编码  
    8.     QByteArray bUtf8 = str1.toUtf8();       // 不受setCodecForLocale影响,强制转换为UTF-8编码  
    9.     qDebug() << str1;                       // 正常,Qt会将UTF-16转换为UTF-8输出  
    10.     qDebug() << baLatin1;                   // 乱码,用UTF-8编码输出Latin1字节流  
    11.     qDebug() << bLocal;                     // 乱码,用UTF-8编码输出GBK字节流  
    12.     qDebug() << bUtf8;                      // 正常,用UTF-8编码输出UTF-8字节流  
    13.   
    14.     QString str2 = QString::fromLocal8Bit(bLocal);  
    15.     qDebug() << str2;                       // 正常,因为上面显式指定字节流来自本机编码,而bLocal正是本机编码GBK  
    16.   
    17.     str2 = QString::fromLatin1(bLocal);  
    18.     qDebug() << str2;                       // 乱码,bLocal是GBK编码,但却指定了以Latin1方式去读取,肯定会乱码  
    19.   
    20.     // 字节流来自UTF-8  
    21.     str2 = QString::fromUtf8("xE4xBDxA0xE5xA5xBDx48x65x6Cx6Cx6F");  
    22.     qDebug() << str2;                       // 正常  
    23.   
    24.     // Qt默认采用UTF-8处理字符串,所以不用显式地去调用fromUtf8  
    25.     str2 = QString("xE4xBDxA0xE5xA5xBDx48x65x6Cx6Cx6F");  
    26.     qDebug() << str2;                       // 正常  
    27.   
    28. }  


    在Qt中,QString会用UTF-16编码存储,而qDebug()等I/O函数会以UTF-8编码处理。

    其实转换后的字节流是正确的,只是显示时用了和字节流不同的编码方式处理导致乱码

    所以当要在Qt中输入输出非UTF-8字符串时应该先转换一下

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

    为了方便将字符串转换为UTF8转义字符,写了一个小工具

    http://download.csdn.net/detail/aqtata/5596247

    2014-5-6补充:

    从vs2010sp1和vs2013开始就已经支持UTF-8的源码文件了,只用在工程里加入一句"#pragma execution_character_set("UTF-8")"即可。不用再做上面的转义了。

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

  • 相关阅读:
    Win10 WSL Ubuntu18.04 编译安装MySQL5.7
    PHP7 深入理解
    php session 测试
    nginx 匹配路由分发php和golang
    composer 库无法提交git
    Win10 1803安装Ubuntu1804子系统
    dhtmlxTreeGrid使用
    win7 64位系统下安装PL/SQL连接Oracle服务器的解决方法
    转载--eclipse快捷键
    JUnit4学习笔记2-Eclipse中使用JUint4进行单元测试
  • 原文地址:https://www.cnblogs.com/findumars/p/6375633.html
Copyright © 2011-2022 走看看