探究Visual Studio中的乱码问题

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

关于乱码,没遇到皆大欢喜,遇到了头痛不已。在Visual Studio中程序遇到乱码,需要明确三个概念,那么问题就好解决了。

三个字符集概念

源码字符集

MSVC中/source-charset

源代码文本文件的字符集,NodePad++、记事本、VS Code这样类似的文本编辑器,可以打开源文件看一下你的字符集(文件编码)。

源代码文本文件是以二进制的形式存在硬盘里的,无论中文英文都一样,当你输入一个汉字后保存关闭,这个汉字就会按照你指定的字符集转换成二进制编码保存下去的,当你在以这个格式打开文件时候,就再按照你指定的字符集把二进制转回来。如果两次使用不同的字符集,也就会出现乱码了。

执行字符集

MSVC中 /execution-charset

在C++里 const char* str = "我";执行字符集决定了这行代码在编译器进行编译的时候,str存储的字节到底是什么,你可能会说源码字符集不是已经决定了这个”我”的二进制表示了么?没错,但是这个执行字符集就是让你在这里对它再解释一次。比如我源码字符集可能是UTF8的,但是我可以通过执行字符集来让最终str存储的是GBK的字节编码。

解析字符集

最终要还原显示这些二进制字节编码的时候,就需要用到它。比如通过printf()把前面的str显示到控制台时,这个printf()就会按照解析字符集来解析这些字节编码,找到指定字符显示出来。

Visual Studio中的字符集分析

默认情况下,Visual Studio 会检测字节顺序标记,以确定源文件是否采用编码的 Unicode 格式,例如 UTF-16 或 UTF-8。 如果未找到字节顺序标记,则假定源文件在当前代码页中编码,除非使用 /source-charset/utf-8 选项指定字符集名称或代码页。 Visual Studio 允许将 C++ 源代码保存在任意几个字符编码中。

代码页是一个字符集,可以包括数字、标点符号和其他标志符号。 不同的语言和区域设置可能使用不同的代码页。 例如,ANSI 代码页 1252 适用于英语和大多数欧洲语言;而 OEM 代码页 932 则适用于日本汉字。

上述为MIcrosoft的官方论述,有点绕。简而言之,对于执行字符集,Visual Studio默认根据系统的Locale来决定执行字符集,一般大家都是Windows中文系统,Locale是中国,那么就是GBK编码。对于解析字符集,如果没有手动更改的话,Visual Studio的标准输入输出(printf,cout)到命令行也是根据系统Locael决定的,也就是GBK。

如何使用UTF-8

为了全过程都能正常显示,不乱码,那应该三个阶段都需要设置为UTF-8。

源字符集和执行字符集设置为 UTF-8

可以使用 /utf-8 选项将源字符集和执行字符集指定为使用 UTF-8 编码的字符集。 它等效于在命令行上指定 /source-charset:utf-8 /execution-charset:utf-8

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
  2. 选择“配置属性”>“C/C++”>“命令行”属性页。
  3. 在“附加选项”中,添加 /utf-8 选项以指定首选编码。
  4. 选择“确定”以保存更改 。

解析字符集设置为 UTF-8

SetConsoleCP 函数设置与调用进程关联的控制台所使用的输入代码页。 控制台使用其输入代码页将键盘输入转换为相应的字符值。

BOOL WINAPI SetConsoleCP(
  _In_ UINT wCodePageID
);

在mian()函数中加入以下代码

std::cout << "GetConsloeCP" << GetConsoleCP() << std::endl;
SetConsoleOutputCP(65001);//65001代表UTF-8,参见代码页标识符
std::cout << "GetConsloeCP" << GetConsoleOutputCP() << std::endl;

qDebug() << QTextCodec::codecForLocale()->name();
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf-8"));//Qt输出
qDebug() << QTextCodec::codecForLocale()->name();

另外,C++11可以指定字符串字面量的执行字符集了,const char* str = u8"我";在字符串前面加u8就可以了。

/source-charset(设置源字符集) | Microsoft Docs

/utf-8(将源字符集和执行字符集设置为 UTF-8) | Microsoft Docs

SetConsoleCP 函数 - Windows Console | Microsoft Docs

代码页 | Microsoft Docs

代码页标识符 - Win32 apps | Microsoft Docs

MSVC中C++ UTF8中文编码处理探究文章来源地址https://www.toymoban.com/news/detail-613067.html

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

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

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

相关文章

  • Visual Studio 番茄助手 安装问题

            最近因为想安装VS2019,卸载了之前的2017,然后就要重新安装番茄助手,然后就遇到了奇奇怪怪的问题。概括起来就是以下2种情况:1、激活失败,导致无法使用;2、显示是正常显示的但是那些功能就是无法正常使用。然后自己在网上找了一些答案,主要原因还是

    2024年02月14日
    浏览(30)
  • visual studio编译c++问题处理

    严重性    代码    说明    项目    文件    行    禁止显示状态 错误    C2760    语法错误: 意外的令牌“标识符”,预期的令牌为“;” 严重性    代码    说明    项目    文件    行    禁止显示状态 错误    C7510    “string_view”: 类型 从属名称的使用

    2024年02月11日
    浏览(39)
  • 解决Visual Stuodio Installer无法识别已经安装Visual Studio问题

    安装VS时更改了安装目录,导致 Visual Stuodio Installer 无法识别到已经安装VS 只可以在下载缓存还存在的情况下才能使用下面的方法 找到 Installer 的安装目录 – C:Program Files (x86)Microsoft Visual StudioInstallersetup.exe – C:Program Files (x86)Microsoft Visual StudioInstallervs_installershell.exe 找到

    2024年02月04日
    浏览(64)
  • 完善解决Visual Studio无法下载安装问题

    今天把很久没用的一台台式电脑重装了系统,然后安装visual studio,去官网下载在线安装器visual studio 2022 installer,但是发现下载不了,提示\\\"无法访问此页面\\\"如下图所示: 无耐百度找了个连接下载了安装器vs_professional.exe,但是安装时又是连接 不上,如下图所示: 百度查了很多方法,有说

    2024年02月04日
    浏览(55)
  • detour编译问题及导入visual studio

    Detours是经过微软认证的一个开源Hook库,Detours在GitHub上,网址为 https://github.com/Microsoft/Detours 注意版本不一样的话也是会出问题的,因为我之前是vs2022的所以之前的detours.lib不能使用,必须用对应版本的x64 Native Tools Command Prompt for VS工具进行编译 我这里使用的visual studio2019版本

    2024年02月11日
    浏览(42)
  • visual studio 2022换背景遇到的问题

    如果要自定义背景图,则可以下载ClaudialIDE 1.在拓展-点击拓展管理-右上角搜索background-点击下载ClaudialIDE-加载完之后需要关闭vs界面进行下载,下载失败,弹出“由于出现以下错误 无法安装一个或多个扩展”。 解决:点右边的详细信息能够直接跳转到微软的介绍页上,这里也

    2024年02月15日
    浏览(72)
  • visual studio中的【console.WriteLine()】日志没有打印出来

    开发环境:visual studio 2022 软件类型:winForm程序 代码里面,我用Console.WriteLine()输出的日志,在【视图-输出】窗口里找不见: using System.Diagnostics 启用Debug.WriteLine替换原来的Console.WriteLine

    2024年02月11日
    浏览(53)
  • Visual Studio Code Python 扩展中的包管理

    排版:Alan Wang Python 凭借其简单的语法和强大的库,目前已成为最流行的编程语言之一,也是最适合那些刚接触编程的人们的语言。但是,随着项目复杂性和规模的增长,管理依赖项的复杂性也会增加。当新用户不断承接更成熟的项目,他们同时也了解了虚拟环境和管理依赖

    2024年02月15日
    浏览(43)
  • visual studio 中的 resharper C++ 插件快速入门指南

    : visual studio resharper  C++  高质量代码 重构 visual studio已经是极具效率的C++生产工具,但是这还不够。使用Resharper C++插件,可以更多的帮助到你。愉快转向现代C++,轻松了解C++中最棘手的方面。快速识别不会发现的错误和代码效率低下,通过安全的快速修复和强大的重

    2024年02月04日
    浏览(50)
  • Visual Studio 2022 include和lib路径问题

    最近安装了Visual Studio 2022,想试下opengl,首先是用cmake尝试编译,结果编译不过,一直报错 LINK : fatal error LNK1104: 无法打开文件“ucrtd.lib” 然后我新建了一个工程,导入了glfw的包打算编译一下,结果好家伙,一编译一大堆报错,全是什么 E1696 无法打开 源 文件 crtdbg.h 之类的

    2024年02月15日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包