分享

使用Visual Studio 2022 MSVC如何将UTF-8字符串输出到控制台

 山峰云绕 2023-02-07 发布于贵州

https://m.toutiao.com/is/ByeLs2w/ 


很多开发者把Visual Studio这套工具称为“神一般的”IDE。就笔者而言,从大学时(2001年)就开始使用Visual C++ 6.0(1996年正式发布);然后进入第一家公司之后开始使用Visual Studio 2005……如今,Visual Studio已经来到了2022版本,就其悠长历史的发展而言,其技术积累可见一斑。

诚然,Visual Studio对于C/C++编程语言而言确实是一款非常棒的IDE,尤其对于企业级大工程量的代码而言,用它进行编辑、开发体验往往可能比同时期的Eclipse、还有现在的CLion等IDE要好用。这里不杠,对于大型项目工程而言,CLion确实比VS更吃内存,响应也更慢~而且最重要的是,VS可直接集成CUDA SDK ToolKit,可直接调试CUDA程序。

然而,Visual Studio也并非完美。比如字符编码问题一直以来都是Windows系统的诟病,而Visual Studio这款被许多程序员神话的IDE也是饱受此诟病。由于历史原因,Windows系统对各个不同的国家地区可能采用不同的code page。由于早先Unicode并未发展成熟,因此Windows的字符编码问题也确实属于一个历史遗留问题。而如今,Visual Studio早就可以支持Unicode字符编码了,但它却仍然不是默认配置,我们要使用UTF-8字符编码进行输出到控制台仍然需要一些比较繁琐的配置。这里笔者就来详细描述Windows 10/11系统下如何在C/C++编程语言中将UTF-8字符串输出到控制台!

我们首先打开Visual Studio 2022,然后点击欢迎界面中的“创建新项目”按钮。在项目模板中选择带有“C++”、“Windows”与“控制台”三个标签的“控制台应用”,如下图所示。

随后我们可以给项目起一个名字,设置其保存目录路径等。笔者这里将该项目名起为“MyLibTest”。

当创建完项目之后,我们会看到右侧“解决方案管理器”中的“源文件”一栏下已经自动创建了一个C++源文件,此时我们可以对该C++源文件修改其文件名,不过后缀名别去动;或者保留现有名字也行。我们可以再鼠标右键点击这个“源文件”,然后选择“添加”,再选择“新建项”,最后新建一个源文件,名为:main.c

下面,为了确保新建的源文件 “main.c” 其字符编码已经是UTF-8编码格式了,我们可以将main.c文件显式地使用UTF-8字符编码格式做另存。我们首先双击我们新建的main.c文件,然后点击菜单栏上的“文件”,随后选择“另存为”,如下图所示:

这时可能会弹出一个提示框要求你确认是否要替换原本的main.c文件,此时选择“”。我们就可以看到下图的对话框:

此时,我们需要点击“保存”按钮右侧的倒三角形按钮,如上图红框框出来的区域所示。最后选择下面的“编码保存(V)”。点击之后我们就能看到选择字符编码的对话框。

这里我们选择的是“UTF-8 无签名”也就是所谓的“UTF-8 NO-BOM”字符编码格式。一般来说,当前Visual Studio 2022所创建的文件一般均默认为带有签名的UTF-8,而这种格式可能在其他类Unix系统上的某些编辑器支持不好,从而也有可能导致乱码。为了可跨平台性,我们使用不带签名的UTF-8会更好一些。

完成这个步骤之后,我们对之前Visual Studio自动创建的C++源文件也这么操作一番。

接着,我们就要开始对项目进行设置了。

首先,我们在右侧的“解决方案资源管理器”一栏中鼠标右键点击我们创建的项目名,然后选择“属性”,如下图所示。

随后,我们先设置一下编程语言标准,如下图所示。

这里先顺带一提,由于我们后面的设置对于所有“构建类型”有效,无论是Debug模式还是Release模式,所以我们这里在“配置”一项中先选中“所有配置”,如左上角红框框出区域所示。然后这里将C++语言标准设定为C++20;C语言标准设定为最新的C17

然后我们可以检查一下字符集是否已经为Unicode字符集了,当前Visual Studio一般默认为Unicode字符集,如下图所示。

最后,也是非常关键的一步设置:我们需要对MSVC设置额外的编译选项——“/utf-8”。如果没有这一选项,我们无论如何都无法正常将UTF-8字符串输出到控制台。

这里C/C++一栏中“命令行”那一项中的“其他选项”这一栏是要自己手工输入的。而这部分也就是Visual Studio给我们对当前MSVC编译器添加额外编译选项的地方。

最后,我们可以编辑C语言源文件——main.c了。

在Windows 10/11环境下,我们还需要调用 SetConsoleOutputCP(CP_UTF8); 这一Windows API来指定控制台输出采用UTF-8编码。这个设置可以放在程序开头。

下面展示一下代码以及程序运行结果:

这里需要提醒各位的是,<Windows.h> 可别忘记包含。此外,W大写的而不是小写的。

而在C++20开始,以及即将发布的C23标准起,UTF-8字符串的字符类型将会由原来的 char 类型改为 char8_t 类型。尽管两者字节长度一样,但由于都作为语言核心中的基本类型,所以两者仍然属于不同类型。而对于原先需要传 const char * 类型的参数而言都需要做一下类型强制转换。下面再举一个C++20的例子:

各位在使用最新标准时也请注意指针类型的转换问题~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多