当前位置: 首页 > news >正文

Qt开发经验 --- 避坑指南(5)

文章目录

    • @[toc]
      • 1 Qt Windows下中文乱码解决方式
      • 2 编码选择
      • 3 QString转QByteArray
      • 4 qmake编译`Missing closing " quote`错误

更多精彩内容
👉内容导航 👈
👉Qt开发经验 👈

1 Qt Windows下中文乱码解决方式

乱码原因

  • 当>=MSVC2013编译器编译程序的时候,会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码,若没有BOM标识符则认为其使用本地字符编码local字符集。我们使用的windows系统本地字符编码为GBK编码。
  • Local字符集是什么?取决于你的设置QTextCodec *codec = QTextCodec::codecForName(???);
  • 如果源文件是UTF-8+BOM的编码方式,还需要在头文件加入
  • 使用qtcreator创建main.cpp,它默认代码里的汉字使用utf8字符集。msvc编译器默认汉字使用gb18030字符集

解决办法

  • 方法1:在QtCreator中打开工具->选项->文本编辑器->文本编码,默认编码设置为tuf-8,UTF-8 BOM设置为总是删除;

  • 办法2:在.pro文件中添加下列代码,注意不能与方法3同时使用,否则编译失败;

    • 只能在msvc编译器下使用,否则编译失败

    • 如果要同时将源字符集和执行字符集设置为 UTF-8,可以使用 /utf-8 编译器选项作为快捷方式。 它等效于命令行上的 /source-charset:utf-8 /execution-charset:utf-8。 这些选项中的任意选项都默认启用 /validate-charset 选项。

      在MSVC 2015中,/utf-8选项是从14.0.23506版本开始支持的。

      因此,只有MSVC 2015 Update 3及更高版本的编译器才支持/utf-8选项。

      如果您的MSVC 2015版本低于14.0.23506,那么您需要升级到最新的版本才能使用/utf-8选项。

      您可以通过“帮助”->“关于Microsoft Visual Studio”菜单来查看您的MSVC 2015版本号。如果您的版本号低于14.0.23506,可以尝试升级到最新的更新版本,或者使用其他选项来指定源文件的字符集编码。

    # 使用utf-8编码
    msvc {
    QMAKE_CFLAGS += /utf-8
    QMAKE_CXXFLAGS += /utf-8
    }/* VS2010 记得一定要打上SP1补丁*/
    //VC2010~2015 必须加入这行预编代码
    // 此编译器指令在 Visual Studio 2015 Update 2 及更高版本中已过时
    #pragma execution_character_set("utf-8")#VS2017 必须在编译器中设置,这是QT的PRO设置,source-charsetr指源代码、execution-charset编译后的程序或库,可以直接加入 QMAKE_CXXFLAGS += /utf-8 
    contains( CONFIG, "msvc" ): QMAKE_CXXFLAGS +=  /source-charset:utf-8 /execution-charset:utf-8
    contains( CONFIG, "msvc" ): QMAKE_CFLAGS +=  /source-charset:utf-8 /execution-charset:utf-8#VS2017 必须在编译器中设置,这是QT的PRO设置, 直接/utf-8时,有些编译器不支持
    contains( CONFIG, "msvc" ): QMAKE_CXXFLAGS += /utf-8 
    contains( CONFIG, "msvc" ): QMAKE_CFLAGS +=  /utf-8 
    
    • 详情
  • 办法3:在源文件中添加

    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif// main函数中添加//设置中文编码
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    #if _MSC_VERQTextCodec *codec = QTextCodec::codecForName("gbk");
    #elseQTextCodec *codec = QTextCodec::codecForName("utf-8");
    #endifQTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);
    #elseQTextCodec *codec = QTextCodec::codecForName("utf-8");QTextCodec::setCodecForLocale(codec);
    #endif
    
  • 如果源文件是UTF-8+无BOM的编码方式,则一定不能加#pragma execution_character_set(“utf-8”),不然会产生乱码。

  • 综上所述,解决Qt5中文乱码的一个比较好的方式,源文件设置BOM标识的utf-8编码,执行字符集为设置为utf-8。这样源字符集,执行字符集都是一致。

2 编码选择

  1. 如果该工程不需要跨平台使用(只在win),那么工程设置请使用GBK的编码方式.
  2. 如果该工程要跨平台使用(win+linux),那么工程设置请使用UTF-8+BOM的编码方式,并在文件中添加# pragma execution_character_set("utf-8") ;
    • 但是需要注意的时utf-8 bom编码会在文件头部默认添加3个字符,这三个字符会导致一些问题,如css样式表失效或加载GLSL文件失效。

3 QString转QByteArray

三种方式

  • toUtf8() :输出UTF-8编码的字符集
  • toLatin1():ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF。亦称为Latin1,中文返回?
  • toLocal8Bit():是本地操作系统设置的字符集编码或 QTextCodec::setCodecForLocale(codec);指定的编码
QString str("Hello World 你好"); 
QByteArray bytes = str.toUtf8();       // QString转QByteArray方法1
QByteArray bytes = str.toLatin1();     // QString转QByteArray方法2
QByteArray bytes = str.toLocal8Bit();  // QString转QByteArray方法3

4 qmake编译Missing closing " quote错误

  • Mingw编译器,QtCreator10.04,Qt5.14.2就会报错误
  • 如果使用MSVC就不会
  • 是由pro文件中有中文,并且文件编码格式不对导致的,使用文本编辑器打开文件,设置为utf-8 bom就可以了。


相关文章:

  • OpenCV-Python (官方)中文教程(部分一)_Day21
  • IT行业词汇科普手册
  • 对京东开展外卖业务的一些思考
  • DeepSeek全域智能革命:从量子纠缠到星际文明的认知跃迁引言:认知边界的坍缩与重构
  • 发那科机器人3(机器人编程基础)
  • Linux/AndroidOS中进程间的通信线程间的同步 - 共享内存
  • Kafka的核心组件有哪些?简要说明其作用。 (Producer、Consumer、Broker、Topic、Partition、ZooKeeper)
  • STM32开发printf函数支持
  • LabVIEW 与 NI 硬件(PXI, CompactRIO, DAQ, RF, Vision)的深度研究与未来发展趋势-分析报告
  • 【AI】模型与权重的基本概念
  • LeetCode热题100--73.矩阵置零--中等
  • JC/T 2187-2013 铝波纹芯复合铝板检测
  • 如何保证Kafka生产者的消息顺序性? (单分区内有序,需确保同一Key的消息发送到同一分区)
  • IBM BAW(原BPM升级版)使用教程Toolkit介绍
  • C语言--字符函数
  • 前端面试每日三题 - Day 27
  • 【“星睿O6”评测】Armv9.2a、KLEIDIAI及vulkan加速llamacpp部署本地AI
  • 数据清洗-电商双11美妆数据分析(二)
  • Java UUID生成如何保证唯一性?深入解析与最佳实践
  • C语言| 递归求两个数的最大公约数
  • “春申阡陌”漆画展:将传统漆艺融入现代创作
  • 中国词学研究会原会长、华东师大教授马兴荣逝世,享年101岁
  • 吉林市马拉松5月18日开赛,奖牌、参赛服公布
  • 以总理内塔尼亚胡称决心彻底击败哈马斯
  • 万玲、胡春平调任江西省鹰潭市副市长
  • 上交现场配乐4K修复版《神女》:默片巅峰有了新的打开方式