IDE /Qt Creator 文本编辑器之文件编码设置

news2024/9/22 19:45:47

文章目录

  • 概述
  • "QtCreator 文件编码" 配置项的使用效果
  • 将代码文件修改为GB2312编码
  • "QtCreator 文件编码" 配置项的功能
  • 不会影响qml文件的加载方式
  • 改动pro文件的编码格式?
  • 其他

概述

在 Qt Creator 工具 - 选项 - 文本编辑器 - 行为选项卡中,存在一个叫作 “文件编码” 的配置项。其默认配置如下,
在这里插入图片描述
我是栽了不少坑之后,才理解到它的用途和作用方式的。这是一个有用的配置项,尤其是在使用 Qt Creator + MSVC 组成的集成开发环境时。我是在整理 《IDE/warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符》、《IDE/集成开发环境 QtCreator+MSVC编译器+CDB调试器》等文章的过程中,插空来整理的此篇文章。如果你对字符编码没有一丁点的理解,可以参考如上两篇文章,本文只重点说明 “Qt Creator 工具 - 选项 - 文本编辑器 - 行为 - 文件编码” 这个配置项的功能含义、使用方式和实际应用效果。

启用 “Qt Creator 工具 - 选项 - 文本编辑器 - 显示 - Display file Encoding” 这个配置项后,可以在Qt Creator编辑器窗口的右上角直接显示 “当前代码文件是以何种字符编码方案为依据来进行解析并展示到QtCreator编辑器界面中的”。千万要注意,这里的 “编码方式” 并不是代码文件实际的编码方式(所谓实际的编码方式,可大约理解为文件在磁盘中存储时使用的编码方式),而是编辑器以何种字符编码加载并显示了相关文件。
在这里插入图片描述

“QtCreator 文件编码” 配置项的使用效果

早期我对此配置项的功能含义,存在理解错误,认为修改了它,即,会影响到新建的代码文件的编码方式,但事实并非如此。
先强调一点,这个"文件编码" 配置,是针对QtCreator整个集成开发环境的,而不是针对某个具体项目的,一旦设置,后续重新打开QtCreator软件实例,都将使用新配置。另外需要知道,在VS中新建的所有的代码文件都是本地编码格式(显示为ANSI或GB2312或GBK或GB18030)。接下来开始实际操作,

修改文件编码方式为 GB2312, 关闭 QtCreator 并重新打开,新建一个简单的 Qt idget 工程 EncodeX,生成如下,EncodeX.pro、main.cpp、widget.h、widget.cpp、widget.ui 共计5个文件。通过NotePad++或记事本观察文件编码方式。

整个测试过程如下,

1、项目创建成功后,可见,所有文件都是UFT-8无BOM的编码格式,尽管我们已经设置了QtCreator环境下的 “文件编码” 配置项为 GB2312 编码方案。要注意的是,全部初始文件中是没有任何的中文字符的。
2、以 mian.cpp 文件为例,在其中添加一行英文注释,如 “Chinese characters” ,并保存。其文件编码格式不会变化。
3、同2中测试方法,将注释行修改为 “中国汉字” 并保存。会发现文件编码格式被自动修改成了ANSI,这就是 “QtCreator 文件编码配置项” 设置为GB2312的作用效果。
4、在工程pro文件的末尾添加 “#中国汉字” 注释行,保存后,其编码格式也会成为 ANSI。此仅为测试,实际情况并不建议pro中有任何中文字符,以使其保持UTF-8编码。
5、在项目资源树的widget.ui文件上右键,以普通文本编辑器的方式打开它,修改windowTitle标签下的string名称为 “中国汉字编码测试”,保存后,ui文件的编码格式也会成为 ANSI。仅为测试,实际情况下,不建议直接以文本编辑的方式打开ui并修改它,更不期望将ui文件的编码方式被修改为默认的UTF-8编码格式之外的其他编码格式。
6、这里很神奇。我们将上述全部文件中的中文字符全删除掉,然后保存。全部文件的编码格式将如数恢复成UTF-8无BOM编码方案。
7、确认6中的文件编码格式已经恢复如初,保持QtCreator文件编码设置依然为GB2312字符编码。使用 UI Designer 设计器来修改ui文件,如通过ui设计师修改Widget属性中windowTitle为"汉字编码测试",并保存。由于这个操作并没有QtCreator文本编辑器的参与,所以即使这里输入了汉字字符,也不会影响到ui文件的编码格式。

将代码文件修改为GB2312编码

如下讨论的前提是,“Qt Creator 工具 - 选项 - 文本编辑器 - 行为 - 文件编码” 已经配置为 GB2312字符编码方案。项目背景是,在Qt Creator + MSVC 编译器集成开发环境下,使得所有代码文件使用GB2312编码,以匹配MSVC编译器默认选用的"多字节字符集"编译配置。相关新文件和旧文件的改造过程如下:

对于新建的文件, 其内部通常不包含任何中文字符,在这里插入图片描述
在资源树上双击打开,虽然现在文件的编码方式是UTF-8,但是由于其中不含任何中文字符,所以可以被GB2312正确加载和显示(右上角显示了是以何种编码方案加载的此文件)。我们在代码中输入必要的中文字符后保存,此时,文件编码将变为 GB2312 方案。从界面上我们无从得知这种代码文件编码方式的变更。

如果要改造一个已经包含了中文字符的UTF-8编码的文件,要稍微麻烦一点。首先,当我们在QtCreator 打开此类文件时,
在这里插入图片描述
如上图所示,以GB2312加载这个包含中文的UTF-8编码的文件,其中文显示为乱码,且Qt Creator 会警示我,不能以GB2312编码正确打开此文件。注意,在此告警下,即使你叉掉了告警提示,文件还是被锁定的,是不可以编辑的。我可以按照此提示,重新选择加载此文件使用的编码方案,
在这里插入图片描述
如上图操作,以UTF-8编码重新载入文件,可使得显示正常,并可进行编辑。
在这里插入图片描述
需要注意的是,上述操作中重新选择的载入方式,会覆盖掉原QtCreator文本编辑器配置中的文件编码设置,使得其不对此文件发生作用。即在上图中我增加了 “我再追加几个中国汉字” 字符后,此时我保存文件,该文件的编码方式依然位置UTF-8不变。

因此,我们只能通过外力来改变一个已经包含中文字符的UTF-8编码的文件,使得其编码方式从 UTF-8编码 转变为 GB2312 等其他编码方式,而不能(至少我没发现什么在QtCreator下的更直接的方式)直接在QtCreator下修改它。方法有很多,
在这里插入图片描述
如上图,在Notepad++软件中,菜单 - 编码 - 转为 ANSI 编码,然后点击保存。如果你有时间,还可以继续设定ANSI的详细化设置,
在这里插入图片描述

“QtCreator 文件编码” 配置项的功能

经过上述两个小节的实际测试,分析其效果,我们可以得出,“Qt Creator 工具 - 选项 - 文本编辑器 - 行为 - 文件编码” 配置项的具体功能如下:
1、打开文件时的默认编码
当你在Qt Creator中打开一个文本文件时,它会根据该配置来确定默认优先使用的字符编码格式,以加载和显示文件。如果该项的配置与文件实际的编码格式不匹配,且内部含有中文字符,则中文将显示乱码,且有编码错误提示信息。
2、保存文件时的默认编码
发挥该作用的前提是:依据该配置中的文件编码设置,首先你要能无异常的打开加载目标文本文件。当文件中没有任何中文字符时,即使该配置的编码格式与实际的文件编码不一致,也可以无异常打开。原文件时UTF-8格式,你输入任何汉字字符后,保存文件,则文件的编码格式将被QtCreator编辑器转换为该配置设置的GB2312类型。
3、如上一节<将代码文件修改为GB2312编码>中描述的那样,用户在编辑界面后选择的文件编码方式,会覆盖掉 “Qt Creator - 文本编辑器 - 文件编码” 配置,包括干掉该配置项 “篡改” 文件原编码方式的效果。

不会影响qml文件的加载方式

通过实际测试可见,“QtCreator 文件编码” 配置,并没有影响到qml文件的默认加载方式。即使我们在QtCreator下配置了文件编码方式为GB2312,当你在项目资源树上双击打开某个qml文件时,其默认还是以UFT-8打开。
在这里插入图片描述
如上图,右上角直接显示了文件是以UTF-8加载的,而没有使用配置的GB2312加载,并提示编码不匹配。添加中文字符后,保存,并不会改变该qml文件的字符编码格式。这里的编辑过程虽然有Qt Creator 编辑器的直接参数,却没有收到文本编辑器-文件编码配置的作用影响。这可能是QtCreator有意为之,也可能是其他原因。我的猜测是,Qt为了使得qml更具跨平台性能,也考虑Qml编译器、调试器的综合兼容性等情况,做了特殊处理。总的来说,这种 “特殊处理”,对Qt用户只有好处没有弊处。

改动pro文件的编码格式?

在这里插入图片描述
在将Qt Creator 文本编辑器中文件编码方式设置为 GB2312后,在未同步改变PRO文件的编码方式前。如果我们继续在工程中添加新类或新代码文件,将有可能遇到上述告警:Failed to add to Project - Qt Creator。
虽然存在上述告警,但是对应的文件是被成功创建到本地目录的。在这种情况下,即使使用添加已有文件功能,还是有继续有类似上述告警弹出。最终问题原因定位于:
Qt工程pro文件的编码格式为UTF-8,且其中含有中文注释;Qt Creator文本编辑器配置了文件编码格式为 GB2312。在这两种不匹配配置的相互作用下,当在Qt Creator中进行文件添加操作时,写入pro文件是失败的。
修改pro文件的编码方式为GB2312,或者删除pro文件下的任何中文字符,都可以解决这个问题。早些年都是使用后者方案,没什么毛病,除了不能有任何中文注释。目前使用前者,暂时没有发现问题。

其他

关于字符集和字符编码的相关知识,关于IDE继承开发环境的搭建注意事项等,本没有赘述。如有需要请参考 《IDE/warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符》、《IDE/集成开发环境 QtCreator+MSVC编译器+CDB调试器》、《IDE /Qt Creator工程转VS2015工程》、《IDE/VS项目属性<字符集> 配置项 + UTF-8之BOM问题》、《字符处理/字符编码在文件存储和文本显示中的作用过程》等文章,它们现在大都是草稿,还没有发布。 相关文章中会介绍,代码页标识符、字符集和字符编码方案、源字符集和执行字符集、编译器使用的字符集,等基础概念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ入门指南

人生永没有终点。只有等到你瞑目的那一刻&#xff0c;才能说你走完了人生路&#xff0c;在此之前&#xff0c;新的第一次始终有&#xff0c;新的挑战依然在&#xff0c;新的感悟不断涌现。 文章目录 一、MQ与RabbitMQ概述1. MQ简述2. MQ的优势3. MQ的劣势4. 常见的MQ产品5. Rab…

【Redis】Redis高可用

目录 主从复制1. 全量复制2. 增量复制3. 主从复制的问题&#xff08;1&#xff09;. 主从复制延迟&#xff08;2&#xff09;. 读到过期数据&#xff08;3&#xff09;. 主从配置不一致导致数据丢失&#xff08;4&#xff09;. 全量复制性能损耗大&#xff08;5&#xff09;. 主…

机器人动力学与控制学习笔记(十五)——机器人路径规划

十五、机器人路径规划 15.1 机器人运动规划 机器人运动规划包含三个层次的内容&#xff1a;即路径规划、轨迹规划、轨迹跟踪或轨迹控制。路径规划是确定不含时间信息的几何路径。一般的工业机器人中都含有点到点&#xff0c;直线&#xff0c;圆弧及样条曲线等常用轨迹的路径…

【进程】进程概念及相关函数实现

目录 0. 进程概述 1. 创建进程 1.1 进程的创建&#xff1a;fork函数 1.2 进程的等待&#xff1a;wait()、waitpid() 1.3 特殊进程&#xff1a;僵尸进程、孤儿进程、守护进程 1.4 进程的终止&#xff1a;exit和_exit函数 1.5 进程退出清理&#xff1a;atexit函数 1.6 进…

【我的创作纪念日】关于某站的音频爬虫+GUI

文章目录 一、前言&机遇二、爬虫代码三、爬虫GUI四、文件打包五、结果展示未来可期 一、前言&机遇 许久没看私信内容&#xff0c;一上线就看到了官方的私信&#xff0c;我已经来到CSDN1024天啦&#xff01; 想到注册这个号的初衷是学习记录爬虫&#xff0c;后面渐渐变…

抖音产业带服务商哪些类目在招募?开通需要什么条件?

5月&#xff0c;刚刚结束的抖音电商生态大会上&#xff0c;抖音电商总裁魏雯雯披露&#xff0c;近一年平台GMV增幅超80%。其中&#xff0c;商城GMV同比增长277%&#xff0c;电商搜索GMV同比增长159%&#xff0c;货架场景GMV在平台GMV占比超30%。过去一年&#xff0c;抖音电商直…

数据结构与算法——树与二叉树

&#x1f60a;数据结构与算法——树与二叉树 &#x1f680;前言&#x1f680;树&#x1f6a2;树的定义&#x1f6a2;树的基本术语&#x1f6a2;有序树和无序树&#x1f6a2;森林 &#x1f680;二叉树&#x1f6a2;二叉树的定义&#x1f6a2;二叉树的性质&#x1f6a2;满二叉树&…

【VUE】Element UI 表单校验出现async-validator: [‘discipline is required‘]报错

问题:async-validator: [discipline is required] 选择器已经获取到数值&#xff0c;却显示获取到 解决办法如下

线性规划算法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 本文部分内容来自网友博客 一&#xff0c;线性规划 例如&#xff0c;一个企业“生产计划”的线性规划模型如下&#xff1a; 是subjec…

​如何优雅的卸载Edge浏览器

如何优雅的卸载Edge浏览器 由于Edge浏览器越来越复杂&#xff0c;功能越来越繁琐我是真的一刻也用不下去了。虽然我主力是火狐浏览器&#xff0c;Edge用来访问一些只能使用Chromium内核的网页作为备用。 但是我现在一打开Edge浏览器我就窝火&#xff0c;也懒得再去调整优化&a…

【表格树状】jqgrid表格树状折叠效果实现(附代码,留邮箱发demo)

【写在前面】有段时间没好好的整理一篇前端文章了&#xff0c;之前的6月城市活动也结束了&#xff0c;期待下周的榜单公布&#xff0c;其实这个月还有一个东西也让我牵肠挂肚的&#xff0c;就是软考的成绩也会在这个月的中旬公布&#xff0c;也是感觉很悬。既成定局&#xff0c…

【中间件-Openjob】高性能任务调度框架Openjob简介及快速搭建

介绍基础基础信息任务调度框架对比 特性高可靠高性能定时调度分布式计算延迟任务工作流程权限管理告警监控跨语言 安装访问docker-compose安装在线访问 总结 介绍 一款分布式高性能任务调度框架&#xff0c;支持多种定时任务、延时任务、工作流设计、轻量级分布式计算、无限水平…

el-form动态嵌套表单验证

v-for 遍历的表单校验 根据官网的介绍&#xff0c;是在 el-form-item 中使用 :rules 属性&#xff0c;同时 prop 属性直接定位到具体循环元素。这个用法的前提是在循环外面包裹一个 el-form 元素&#xff0c;v-for 位于 el-form-item 中。 <template><el-form:model…

深入浅出对话系统——对话管理与对话生成

引言 对话管理 我们知道对话管理主要包括状态追踪(DST)和策略优化(DPO)。 对话管理模块包含两个子任务&#xff1a; 对话状态追踪(Dialogue State Tracking) 根据用户输入和对话历史识别对话状态&#xff1b;策略学习(Policy Learning) 根据识别到的对话状态选择合适的下一步…

BC SU21 对象 ZJHD_LGO 已交付;只能进行有限更改

ECC 升级S4 库位从ECC的唯一库位 → S4 工厂 库位才能唯一。 那原先的 依据库存地 控制库位的zjhd打印机的权限需要新增工厂字段。 但是su21的修改的时候 提示 &#xff1a;对象 ZJHD_LGO 已交付&#xff1b;只能进行有限更改 查了一下&#xff0c;SAP官方说只能 把该权限…

HCIP第二次作业

要求&#xff1a;R1-R2-R3-R4-R5 RIP 100运行版本2 R6-R7 RIP 200 运行版本1 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1-R2之间增加路由传递…

部署springboot项目读取外部配置文件

我们在部署springboot项目的时候&#xff0c;经常会遇到这样的情况&#xff1a;测试环境与生产环境的配置不一样&#xff0c;这就导致每次部署的时候都要修改配置文件再打包&#xff0c;即使用了nacos进行配置管理&#xff0c;但测试环境与生产环境的nacos部署的地方肯定不一样…

MyBatis简单入门

文章目录 快速入Mapper代理开发具体步骤使用mapper代理中的包扫描 查询字段名称不一致问题方法一&#xff1a;对SQL语句起别名方法二&#xff1a; 采用resultMap映射 条件查询单条件查询SQL中特殊字符的处理 多条件查询方式一&#xff1a;散装参数方式二&#xff1a;对象参数方…

ABAP:ABAP解析xml文件的方法

目前我在ECC的系统找到两种实现XML解析的办法&#xff0c;第一种是通过strans创建转化例程&#xff0c;然后在程序中调用转化例程来转化xml&#xff0c;第二种是调用方法按照node解析xml。 要转化的xml文件demo如下 <?xml version"1.0" encoding"Windows-…

1.5 编写自定位ShellCode弹窗

在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码&#xff0c;虽然简易ShellCode可以被正常执行&#xff0c;但却存在很多问题&#xff0c;由于采用了硬编址的方式来调用相应API函数的&#xff0c;那么就会存在一个很大的缺陷&#xff0c;如果操作系统的版本不…