彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

2024-02-26 1720阅读

温馨提示:这篇文章已超过434天没有更新,请注意相关的内容是否还可用!

彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

  • Chapter1 (彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
    • 一、Qt Creator环境设置
    • 二、编码知识科普
      • Qt常见的两种编码是:UTF-8和GBK
      • 三、编码转换
      • 四、QString显示中文乱码的原因
      • 五、Qt编码指定
        • 情况1:指的是Local字符集为GBK
        • 情况2:指的是Local字符集为UTF-8
        • 六、测试案例
          • 解决方法由两种:
          • 七、结论
          • pragma execution_character_set("utf-8")
          • Chapter2 Qt解决中文显示乱码问题
          • Chapter3 Qt解决中文乱码问题(更新于2023.10.1)
          • Chapter4 QString各种字符编码转化,适用不同Linux系统中文乱码问题
          • Chapter5 qt中文乱码原因分析及解决方案
            • 首先说明几个基础概念
            • **解决方案**
            • 总结

              Chapter1 (彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

              原文链接:

              这篇文章有点长,内容有点多,如果时间急迫,可以直接翻页去末尾看结论。红色字体加粗的。

              一、Qt Creator环境设置

              1、cpp或h文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.

              我们使用的Windows系统本地字符集编码为GBK。

              2、Windows环境下,Qt Creator,菜单->工具->选项->文本编辑器->行为->文件编码->默认编码,常用的选项有以下几个:

              System(简体中文windows系统默认指的是GBK编码)

              GBK/windows-936-2000/CP936/MS936/windows-936

              UTF-8

              二、编码知识科普

              Qt常见的两种编码是:UTF-8和GBK

              ★UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

              ★GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。GBK是GB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。

              ★GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:

              GBK、GB2312--Unicode--UTF8

              UTF8--Unicode--GBK、GB2312

              ★在简体中文windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使用0x800xFF范围的2个字节来表示1个中文字符。0x000x7F之间的字符,依旧是1个字节代表1个字符。Unicode(UTF-16)编码则所有字符都用2个字节表示。

              三、编码转换

              Windows自带的记事本,无法查看UTF-8编码的文件到底有无BOM,需要使用其他文件编辑器,比如EditPlus或者SublimeText。

              UTF-8与ANSI(即GBK)的互转,可以使用EditPlus工具"文件另存为"或者Encodersoft编码转换工具对.cpp和.h源文件文本进行批量转换.

              四、QString显示中文乱码的原因

              我们使用的Windows系统本地字符编码(Local字符集)为GBK。编译器分析出源文件字符编码之后,会进行解码再编码,将源字符集转码成执行字符集。执行字符集一般默认为使用本地字符编码(Local字符集)。

              Qt5可以设置Local字符集,GBK/UTF-8

              QTextCodec *codec = QTextCodec::codecForName("UTF-8");//或者"GBK",不分大小写
              QTextCodec::setCodecForLocale(codec);
              

              Qt5中QString内部采用unicode字符集,utf-16编码。构造函数QString::QString(const char *str)默认使用fromUtf8(),将str所指的执行字符集从utf-8转码成utf-16。

              由上面fromUtf8()可知,QString需要执行字符集编码为utf-8,然后以utf-8进行解码,再编码为utf-16才能获得正确的字符编码。显示中文乱码的原因其实就是QString转码方式与执行字符集不一致。(比如,源字符集为本地字符集GBK编码,QString以utf-8的方式进行解码,会导致获得错误的二进制编码,再将错误二进制转为utf-16就会出现乱码。)

              五、Qt编码指定

              Qt需要在main()函数指定使用的字符编码:

              #include 
               
              int main(int argc, char *argv[])
              {
                  QApplication a(argc, argv);
               
                  //设置中文字体  
                  a.setFont(QFont("Microsoft Yahei", 9));
               
                  //设置中文编码
              #if (QT_VERSION = 1600)    
              # pragma execution_character_set("utf-8")    
              #endif
              

              或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中。

              如果源文件是UTF-8+无BOM的编码方式,则一定不能加#pragma execution_character_set(“utf-8”),不然会产生乱码。

              六、测试案例

              案例1、中文字符串测试

              #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
              # pragma execution_character_set("utf-8")    
              #endif
               
              #include 
              #include 
              #include 
              #include 
              #include 
              #include 
               
              int main(int argc, char *argv[])
              {
                  QApplication a(argc, argv);
               
                  //设置中文字体  
                  a.setFont(QFont("Microsoft Yahei", 9));
               
                  //设置中文编码
              #if (QT_VERSION 
                  QApplication a(argc, argv);
                  //设置中文字体  
                  a.setFont(QFont("Microsoft Yahei", 9));
              //设置中文编码
              #if (QT_VERSION 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]