文章目录
- 概述
- "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问题》、《字符处理/字符编码在文件存储和文本显示中的作用过程》等文章,它们现在大都是草稿,还没有发布。 相关文章中会介绍,代码页标识符、字符集和字符编码方案、源字符集和执行字符集、编译器使用的字符集,等基础概念。