记录一次QT乱码问题

这篇具有很好参考价值的文章主要介绍了记录一次QT乱码问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

在敲陆文周的书《QT5开发及实例》的示例代码时,出现乱码,如下图所示
记录一次QT乱码问题,qt,开发语言
具体代码如下

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->treeWidget->clear();

    int groupSize = 2;
    int itemSize = 4;


    for(int i=1;i<=groupSize;i++){
        QTreeWidgetItem *group = new QTreeWidgetItem(ui->treeWidget);
        group->setText(0,QString("小组")+QString::number(i));
        group->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
        group->setCheckState(0,Qt::Unchecked);
        for(int j=1;j<=itemSize;j++){
            QTreeWidgetItem *subItem = new QTreeWidgetItem(group);
            subItem->setText(0,QString("项目")+QString::number(i)+QString::number(j));
            subItem->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
            subItem->setCheckState(0,Qt::Unchecked);
        }
    }
}

原因分析

在阅读csdn大佬急支糖浆的文章后,理解了 源文件码字符集,执行字符集等概念。

  • 源文件编码字符集:源文件保存时的编码方式,如gbk,utf-8等。
  • 执行字符集:编译器编译后的可执行文件的编码方式。
    本人采用的源文件编码字符集为UTF-8 BOM,编译器为msvc2019,由于源文件编码字符集带BOM,因此,msvc的执行字符集会变为local编码,即GBK(系统为中文系统)。到这里,一切都是正常的。
    罪魁祸首:因为QT中的QString在初始化时会使用QString::fromUTF8将UTF-8编码转为UTF-16编码,由于执行编码为gbk,这里使用fromUTF8是错误的,这便是乱码的原因所在,下图可证明我的观点:
    记录一次QT乱码问题,qt,开发语言
    可以看到,使用cout打印出字符串是正确的,因为它不需要像QString那样使用fromUTF8函数进行转码。

解决方案

  • 换成mingw编译器,这样无论源文件编码字符集是否带BOM,mingw都会采用utf8作为执行字符集,这样QString使用fromUTF8函数就能转码成功。
  • 继续使用msvc编译器,但需要加上预编译指令指示编译器采用utf-8作为执行字符集#pragma execution_character_set("utf-8")
  • 继续使用msvc编译器,但是将文件编码方式设置为不带BOM,这样fromUTF8也能正确转码,但可能出现其它问题,如一些中文的标点字符是必须带BOM的,会让编译器无法识别而报错,因此不推荐该方法。
    记录一次QT乱码问题,qt,开发语言
  • 指示QString使用locale编码来进行转码,但这种方式在高版本的qt中貌似已经失效
 QTextCodec *codec = QTextCodec::codecForName("utf-8");

 QTextCodec::setCodecForLocale(codec);
 QTextCodec::setCodecForCStrings(codec);
 QTextCodec::setCodecForTr(codec);

推荐采用第二种方案解决。文章来源地址https://www.toymoban.com/news/detail-821968.html

到了这里,关于记录一次QT乱码问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    原文链接: 这篇文章有点长,内容有点多,如果时间急迫,可以直接翻页去末尾看结论。红色字体加粗的。 1、cpp或h文件从window上传到Ubuntu后会显示乱码, 原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK. 我们使用的Windows系统本地字符集编码为GBK。 2、Windows环境下,Qt C

    2024年02月05日
    浏览(49)
  • 面试问题记录一 --- C++(Qt方向)

            以下是我于2023年6~7月间换工作时遇到的面试题目,有需要的小伙伴可以参考下。约100个题目。 1       C和C++的区别          1)      文件区别:C源文件后缀 .c;C++源文件后缀 .cpp          2)      返回值: C默认返回int型;C++ 若无返回值,必须指定为

    2024年02月09日
    浏览(38)
  • Linux 打包Qt程序到无Qt环境Linux系统下运行,问题记录

    Linux 环境下Qt开发的摄像头程序用到了opencv的库,需要跟Qt环境一起打包。 1.打包所有关联库用的是脚本程序。 2.新建空文件夹放入编译好的release qt程序,比如摄像头程序 camera,新建打包脚本copylib.sh放在文件夹下。   3.终端执行 ./copylib.sh camera 会打包 camera程序所需的关联库。

    2024年02月16日
    浏览(44)
  • 记录:Qt Creator 10配置安卓开发环境

    Qt Creator 现在的安卓开发环境配置相比老版本方便了不少,本文以目前在线安装版的 Qt Creator 10.0.2 + Qt 5.15 / Qt 6.5 为例做演示(有些文件可能会因为网络问题需要科学上网才能下载)。 https://adoptium.net/zh-CN/temurin/releases/ Oracle 的 JDK 有商业授权问题,所以直接下 OpenJDK 就行了。

    2024年02月10日
    浏览(47)
  • qt 乱码 dll 乱码

    DLL 传入的 参数有 汉字乱码问题 接口时 纯c的, char*指针 1.exe 调用 dll , QString 直接转 toUtf8() 2 exe1调用exe2调用 dll 都是qt工程 第一次调用时通过QProcess 调用exe2 在exe2 中 不能直接使用 argv[1] 作为参数传入dll, 这样乱码 需要 a.arguments().at(1).toUtf8() 这样传入

    2024年02月08日
    浏览(28)
  • QT支持多种开发语言

    QT主要是一个C++应用程序框架,但它也提供了对其他一些编程语言的官方或非官方支持。以下是QT支持的一些语言版本及其特点。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.Python (PyQt)  : PyQt是QT的官方Python绑定,允许Python开发者使用QT库来创建

    2024年04月29日
    浏览(48)
  • QT记录一个解决QlistWidget列表项加载较慢的问题

    之前使用qlistwidget加载其他widget显示时会存在一个问题,就是大量的数据加载会导致界面之间的切换卡顿。如图所示: 大量的数据会导致进入这个界面的速度变慢 原本的代码是这样的 现在只需要在这段代码的后面加入这样的代码即可完成分段式加载,需要注意的是在加载完

    2024年02月07日
    浏览(51)
  • Qt中文乱码解决办法

    1. QT4版本 中文乱码解决办法是在main.cpp文件加入: Windows 系统里一般的记事本、编辑器、VC++ 开发环境等都是默认用 GBK 汉字编码,而 Linux 和 Qt 都是默认用 UTF-8 国际文字编码,所以文本显示乱码一般都是这个原因。 2. QT5版本 Qt5版本之后,类 QTextCodec 已经取消了 QTextCodec::se

    2024年02月05日
    浏览(82)
  • 记录开发环境docker上的一次springboot无法读取更新的配置文件的问题

    背景:一般开发环境的管理不是很严格,当对代码进行一些组件的添加时,往往需要修改spring的配置文件,有的时候为了保险起见,回预先备份原本的配置文件,我采取在./config中创建了一个名为bak-日期的目录,将原本的配置文件mv到该目录下,将新的配置文件移到config目录

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包