IDE/VS项目属性中的 <字符集> 配置项,它到底是干什么用的?

您所在的位置:网站首页 显示属性中包括什么 IDE/VS项目属性中的 <字符集> 配置项,它到底是干什么用的?

IDE/VS项目属性中的 <字符集> 配置项,它到底是干什么用的?

2024-07-13 18:32| 来源: 网络整理| 查看: 265

文章目录 概述对配置项的基础测试VS默认的字符集配置Unicode字符集和多字节字符集是否影响文本编辑器 使VS像记事本那样显示文件编码VS下编译UTF-8无BOM的代码文件VS可以搞定ANSI和带BOM的源代码文件VS搞不定UTF-8无BOM的源代码文件乱码字符是怎么翻译出来的?猜猜看再起航 使VS/MSVC可以正确解析UTF-8代码文件难不成 VS项目属性字符集配置是执行字符集Windows API 之 A 和 W 接口总结

概述

在整理 《QtCreator 下使用MSVC编译器》这篇文章时,回想起当年并没有彻底搞明白 “项目属性 -> 常规 -> 项目默认值 -> 字符集” 配置项的作用。且我坚信,搞明白此问题,那么 Qt + MSVC集成开发环境下的一些原有问题将会不攻自破。于是单独拎出来整理啦此篇文章。整理此篇文章时,我卡壳了,期间去整理发布了 《IDE /字符编码与文本文件(如cpp源代码文件)》,关于字符编码识别技术、BOM等基本内容可以参考其中的相关描述。

对配置项的基础测试

在此之前,我整理了《IDE /Qt Creator 文本编辑器之文件编码设置》,因此参考其中的,文件编码配置项的功能测试情况,对 VS项目属性 - 常规 - 字符集 配置项进行测试。

VS默认的字符集配置

当你在VS下新建不同类型的项目时,生成的默认配置值是不同的,如我们新建的Qt项目, 在这里插入图片描述 如我们新建的控制台应用程序, 在这里插入图片描述 如上,新建不同类型的项目,其默认的字符集配置值是不一样。新建控制台应用程序,默认选择的是使用Unicode字符集,我挺意外的。另外经过实际的测试,如果此处没有选择任何配置,或选择了 “未设置”,那么VS编译器又会作何处理? 这个问题压到后面的章节来解答。

Unicode字符集和多字节字符集

Unicode字符集是一个全面的字符集,能够表示几乎所有的字符,包括全世界各种语言的字符、符号、表情等,共有数十万个字符,具有较好的跨平台支持,但可能占用较大的存储空间。多字节字符集适用于特定语言或地区,通常只包含一部分字符,例如GB2312是一个多字节字符集,它只包含了中文字符和一些特殊符号,此类字符集存储空间较小,但在全球化应用中可能存在局限性。Unicode字符集的优势在于它提供了一种统一的字符表示方式,可以表示几乎所有语言的字符,有利于跨语言和跨平台的文本处理和交换。

多字节字符集(MBCS)通常用于处理特定语言的字符,如中文(GBK、GB18030)、日文(Shift-JIS)、韩文(EUC-KR)等。

GB2312 于1980年发布,最初用于表示包括6763个汉字在内的字符集。采用双字节编码方式,每个汉字用两个字节表示,其中第一个字节的范围是0xA1到0xF7,第二个字节的范围是0xA1到0xFE。由于GB2312只包含有限的字符,对于一些生僻字和少数民族语言的字符无法表示。GB18030 于2000年发布,是GB2312的扩展版本,用于表示更多的字符,包括汉字、日文假名、朝鲜文、拉丁字母、希腊字母等。其采用变字节编码方式,每个字符的编码字节可以是1个、2个、4个,甚至8个字节,根据字符的复杂程度进行编码。GB18030可以兼容GB2312编码,同时支持更广泛的字符范围,是一个全面的中文字符编码方式。

ANSI(American National Standards Institute)字符集通常指的是Windows操作系统下的本地字符集,它是根据地区和语言设置而确定的字符编码方式。对于中国地区的Windows操作系统,默认的ANSI字符集可能是GB2312、GBK、GB18030 等。

需要注意的是, 这里指定字符集设置,但是并没有指定字符集的具体的字符编码方式。因此如果这里选择了适用Unicode字符集,则代码文件的编码格式必须为Unicode字符集下的UTF-8、UTF-16、UTF-32等编码方案? 这是问题,后边会有解答。

是否影响文本编辑器

在 《IDE /Qt Creator 文本编辑器之文件编码设置》一文中,我们见证了 Qt Creator 文本编辑器-文件编码配置是如何影响代码文件的字符编码格式的。所以很想知道,VS下的这个字符集配置项,是否有类似功能。如下,经理了摸着石头过河的阶段,时间不充裕的,可以跳过。

— 20230701 --Begin– 在VS2017下测试新建Qt项目, 我们新建 名为 EncodeM 的 Qt Widget 应用项目,其默认的字符集配置是未进行任何选择的"空",前边已经有过截图。我们打开工程下的 encodem.h、encodem.cpp、encodem.ui、main.cpp文件,查看它们的编码方式均为 UTF-8 Without BOM 编码格式。至于其中的原理,这里不再赘述,请参考《IDE /字符编码与文本文件(如cpp源代码文件)》 在 encodem.h 文件中输入一行中文注释 “//文件竟然是UTF-8无BOM格式的”,然后保存文件,重新查看该文件的编码方式。哟,变成了GB2312编码格式。 将,字符集配置为 “使用多字节字符集”, 在 encodem.cpp 文件中输入一行中文注释 “//文件竟然是UTF-8无BOM格式的”,然后保存文件,变GB2312编码格式。 将,字符集配置为 “使用Unicode字符集”, 在 mian.cpp 文件中输入一行中文注释 “//文件竟然是UTF-8无BOM格式的”,然后保存文件。依然变GB2312编码格式。 添加,新建项,C++类,ClassX, ClassX.h、ClassX.cpp 依然全部是 UTF-8无BOM 格式,在它们中添加中文字符后保存,现象同上。即使现在是选择了字符集配置为 “使用Unicode字符集”。相比QtCreator的文本编辑器-文件编码的效用,这里是毫无卵用的。至此,便有理由推测,VS项目属性 - 字符集设置,不对文件编辑器有影响。

在VS2017下测试新建Win控制台项目, 新建 名为 EncodeD 的 Visual C++ Windows 桌面 控制台应用程序项目,查看EncodeD.cpp文件的编码,如下, 在这里插入图片描述 此时的默认文件编码是 UTF-8 带BOM 编码格式的,该编码格式才是VS的原生啊。添加,新建项,C++类,ClassX,ClassX.h、ClassX.cpp 全部是 UTF-8无BOM 格式,在它们中添加中文字符后保存,会变成GB2312编码格式。即使该新项目时被IDE默认选择了 “使用Unicode字符集” 配置。 — 20230701 --End–

这期间,我在整理 《IDE /字符编码与文本文件(如cpp源代码文件)》,快完成它的时候,心里敞亮了许多。

–后期测试- 20230712 --Begin– 我又重新进行了一次实验。新建名为 EncodeZ 的 Visual C++ Windows 桌面 控制台应用程序项目, 在这里插入图片描述 与前期测试结果相同,EncodeZ.cpp 是UTF-8带BOM文件。然后我们还是添加新建项,C++类,ClassH,它们还会被识别为UTF-8,原因我们都在《IDE /字符编码与文本文件(如cpp源代码文件)》中说明了。接着,我们复制 ClassH.h 为 ClassH_bak_1.h 和 ClassH_bak_2.h,然后操作如下: 1、使用记事本在ClassH_bak_1.h中添加 “//中国汉字” 字符串 2、使用Notepad++在ClassH_bak_2.h中添加 “//中国汉字” 字符串 3、使用VS文本编辑器,在ClassH.h中添加 “//中国汉字” 字符串 全部保存后,重新打开加载它们,可得,ClassH_bak_1.h和ClassH_bak_2.h是UTF-8编码的,ClassH.h是ANSI编码的。在《IDE /字符编码与文本文件(如cpp源代码文件)》的一个结论是: “文本文件以什么编码格式打开,编辑后,便会以什么编码保存”,记事本、Notepad、QtCreator都是这样的,我想以上述例子来反正,VS文本编辑器是以本地编码格式GB2312或GB18030来加载显示的代码文件。

在上述测试基础之上,我将 ClassH_bak_1.h 和 ClassH_bak_2.h 直接拖入到VS文本编辑器中,都能正确打开加载和显示,不会有QtCreator文本编辑器那样的字符编码不匹配的告警。这说明,VS文本编辑器以本地编码加载文件不成功的时候,会自动的去索引尝试其他编码格式。这是文本编辑器的基本功能,就像记事本程序那样。 –后期测试- 20230712 --End–

最后的结论, VS项目属性 - 常规 - 项目默认设置 - 字符集,该配置,其功能与VS文件编辑器采用何种编码来加载文本文件、保存文本文件并没有半毛钱的关系! 后来为重新审视 Qt Creator + MSVC 组成的集成开发环境时,也更加认识到这一点,Qt Creator 文本编辑器文件编码配置 和 MSVC编译器配置,是完全不同的方向。而 VS字符集配置就是针对MSVC编译器的配置之一。VS并没有提供如 Qt Creator 文本编辑器文件编码配置这样的功能。 结合 《IDE /字符编码与文本文件(如cpp源代码文件)》中的相关分析,往 “文件以什么编码格式打开加载,编辑操作后便会以什么编码保存” 这个结论上靠拢的话,我们可以认为VS总是默认首先以本地编码格式加载文本类型的代码文件。如此,当你使用VS编辑器打开那些只用ASCII字符的文件时,若有中文字符输入和保存操作,则相关文件必定 “变为” ANSI编码。

使VS像记事本那样显示文件编码

默认情况下,Visual Studio 是不会直接显示代码文件的编码格式的。然而可以通过一些插件或扩展来实现在 Visual Studio 中显示代码文件的编码格式。例如,“File Encoding Info” 插件。该插件可以在 Visual Studio 的状态栏中显示当前打开文件的编码格式。从VS工具菜单中打开扩展和更新窗口,搜索下载安装即可。 在这里插入图片描述 经过实际测试,当前版本的此插件,质量欠佳。 在这里插入图片描述 不仅显示格式不漂亮,而且分析出来的文件编码类型是不对。实测,无论代码文件是UTF-8带BOM还是GB2312,均被此插件识别为显示为 Unicode(UTF-8) 格式。因此,我果断卸载了,并幻想着以后能自己写一个插件。

VS下编译UTF-8无BOM的代码文件

如下是在好几年前记录下来的,那个时候还在用VS2013 集成开发环境,或者是在用没加装update3的VS2015集成开发环境。原本此记录还有些别的描述,因为已经无从追查,怕引起其他歧义,我删除了当时的文字描述,只保留了测试代码和测试步骤。

#include using namespace std; int main() { std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3