当前位置: 首页 > 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就可以了。


http://www.xdnf.cn/news/329455.html

相关文章:

  • python打卡day18
  • Spring MVC中跨域问题处理
  • 把一个过大的文件夹分成若干个 ZIP 分卷
  • 雅努斯问题(Janus Problem)及解决方案
  • 三轴云台之模糊控制算法篇
  • Golang的linux运行环境的安装与配置
  • AB测试面试题
  • MCP学习
  • 行动作用作用
  • 后端返回文件流,前端展示图片
  • 003 系统和入门指令
  • 【基础知识】常见公式计算(三)
  • 情感共鸣+海外网红营销:跨境电商如何讲好“母亲节”故事?
  • BRAM 64bit位宽报错问题
  • C++ 如何在一个方法中返回多个不同类型的数据
  • [D1,2] 贪心刷题
  • 深入剖析GoFrame日志模块:优势、特色与项目实践经验分享
  • 不同大模型对提示词和问题的符号标识
  • C++:买房子
  • 手动写一个vuex的可持续化插件
  • MySQL的行级锁锁的到底是什么?
  • [Windows] Ghost Downloader v3.5.9 开源多线程下载工具
  • Qt开发经验:回调函数的线程归属问题及回调函数中更新控件的问题
  • css识别\n换行
  • SEO关键词与长尾词精准布局策略
  • 海外短剧H5系统开发:技术架构、SEO优化与全球市场突围策略 [2025版]
  • 通过vllm部署qwen3大模型以及基于 vLLM 的 OpenAI 兼容 API 接口调用方法总结
  • Yocto Project概念(一)
  • 外包团队协作效率低,如何优化
  • AI 大模型新浪潮:从 DeepSeek-Prover 到 Qwen3,再到 DeepSeek-R2,迈向自动推理的新时代20250507