visual studio 2019中文乱码

2023-11-10

1 编码

(1) code编码

vs 中代码文件编码形式 默认 改成utf-8 使用插件 Force UTF-8 (No BOM)

  • 选择扩展-管理扩展后下载对应插件(在搜索框输入UTF-8),将VS的输出编码更改为UTF-8

(2) 控制台编码

(3) txt文件编码

(4) 控制台编码

  1. WIN+R打开,输入regedit
  2. 计算机\HKEY_CURRENT_USER\Console\下的与Visual Studio相关的文件夹,把 Codepage 项的值 65001 改成 936 就可以了。

2 中文输出

两种方式 locale _setmode

(1) 更改 locale 显示中文

locale 详细解释

在main函数中,首先执行了这两行代码对地区环境进行了初始化——

	#include <locale>
    locale::global(locale(""));
    wcout.imbue(locale(""));
  1. locale(“”):调用构造函数创建一个local,其中的空字符串具有特殊含义:使用客户环境中缺省的locale(《C++标准程序库—自修教程与参考手册》P697)。例如在简体中文系统上,会返回简体中文的locale。
  2. locale::global(locale(“”)):将“C++标准IO库的全局locale”设为“客户环境中缺省的locale”。注意它还会设置C标准库的locale环境,造成与“setlocale(LC_ALL, “”)”类似的效果(《C++标准程序库—自修教程与参考手册》P698)。
  3. wcout.imbue(locale(“”)):使wcout使用“客户环境中缺省的locale”。

就这样,使C标准库、C++标准IO库(尤其是wcout)均正确的设置了地区环境,与客户环境中缺省环境完全匹配。

1).coutwcout

csdn:C++_wcout / C_wprintf (wcout输出中文)
csdn:wcout

  • cout是用来输出char的,如果用cout输出wchar,只会输出地址,要使用wcout输出wchar

  • wcout默认是不输出中文的,要想输出中文,要先加入setlocale( LC_ALL, "chs" );这行代码。

在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行。对于wcout,需要将其locale设为本地语言才能输出中文:

	std::wcout.imbue(std::locale(std::locale(),"",LC_CTYPE)); // ①

也有人用如下语句的,但这会改变wcout的所有locale设置,比如数字“1234”会输出为“1,234”

	std::wcout.imbue(locale(""));

2). ofstream wofstream

在缺省的C locale下,ofstream能正确输出中文到文件中,但不支持中文文件名;wofstream支持中文文件名,但不能向文件中输出中文。要解决这个 问题,需要在打开文件之前将全局locale设为本地语言。将全局locale设为本地语言后,ofstreamwofstream的问题都解决了,但 coutwcout却不能输出中文了。要让cout和wcout输出中文,需要将全局locale恢复原来的设置,如下所示:

  locale &loc=locale::global(locale(locale(),"",LC_CTYPE)); // ②
  ofstream ofs("ofs测试.txt");
  wofstream wofs(L"wofs测试.txt");
  locale::global(loc); // ③
  ofs<<"test测试"<<1234<<endl;
  wofs<<L"Another test还是测试"<<1234<<endl;

3). printfwprintf

加上这两位C语言中的老兄,问题更加复杂。考虑如下语句(注意s的大小写):

   printf("%s", "multibyte中文/n");  // ④
   printf("%S", L"unicode中文/n");  // ⑤
   wprintf(L"%S", "multibyte中文/n");  // ⑥
   wprintf(L"%s", L"unicode中文/n");  // ⑦

缺省情况下,⑤、⑦两条语句不能输出中文,这两条语句中字符串的形式是unicode形式的。如果在所有输出语句之前加上如下语句将C语言的全局locale设置为本地语言(C语言中只有全局locale)就可以正常输出了:

  setlocale(LC_CTYPE, "");  // ⑧

但这会导致cout和wcout不能输出中文(汗,的确麻烦),将C语言的全局locale恢复后cout和wcout就正常了,如下所示:

  setlocale(LC_CTYPE, "C");  // ⑨

(2) 通过 _setmode()输出中文

c++中用wcout输出带有中文的wstring为什么会中文乱码?

# include<io.h>
# include<fcntl.h>
_setmode(_fileno(stdout), _O_WTEXT);
std::wcout << L"测试";
wprintf(L"测试");
  1. _O_WTEXT = 0x10000 <fcntl.h>里定义,如果不想加载<fcntl.h>直接用0x10000代替也可以
  2. 注意:如果后面要使用std::coutprint()的话需要在之前运行一次

设置 _setmode后 用std::cout 输出Eigen报错, 使用第一种方法后好了 ,参考文献给了另一种解决办法,并未尝试
stackflow:How to print UTF-8 strings to std::cout on Windows?

Microsoft Visual C++ Runtime Library
Debug Assertion Failed!
Program: d:\visual studio 2015\Projects\utf8test\Debug\utf8test.exe File: minkernel\crts\ucrt\src\appcrt\stdio\fputc.cpp Line: 47
Expression: ( (_Stream.is_string_backed()) || (fn = _fileno(_Stream.public_stream()), 
((_textmode_safe(fn) == __crt_lowio_text_mode::ansi) && !_tm_unicode_safe(fn))))

3 中文乱码问题

中文输出乱码通常是由于编码不符合产生的。c++文件编码于控制台不相符
使用wcout输出中文时

  • 不设置 显示乱码
  • locale 遇到编码不符合的情况会检查到错误,并不输出
  • _setmode 不会检查编码错误,直接输出乱码

(1) 代码与编程环境编码

/utf-8 (Set source and execution character sets to UTF-8)
You can use the /utf-8 option to specify both the source and execution character sets as encoded by using UTF-8. It’s equivalent to specifying /source-charset:utf-8 /execution-charset:utf-8 on the command line. Any of these options also enables the /validate-charset option by default. For a list of supported code page identifiers and character set names, see Code Page Identifiers.

By default, Visual Studio detects a byte-order mark to determine if the source file is in an encoded Unicode format, for example, UTF-16 or UTF-8. If no byte-order mark is found, it assumes that the source file is encoded in the current user code page, unless you’ve specified a code page by using /utf-8 or the /source-charset option. Visual Studio allows you to save your C++ source code in any of several character encodings. For information about source and execution character sets, see Character sets in the language documentation.

To set this compiler option in the Visual Studio development environment

  1. Open the project Property Pages dialog box.
  2. Select the Configuration Properties > C/C++ > Command Line property page.
  3. In Additional Options, add the /utf-8 option to specify your preferred encoding.
  4. Choose OK to save your changes.

(2) 文件编码

Visual C++文本文件读写编码问题

在C++程序中读写文件时,有两个因素涉及到文本编码。一是文本内容的编码,二是文件路径的编码。这两个问题如果不处理好,就可能会出现乱码或者找不到文件的问题。

#include <ifstream>
#include <locale>
	std::ifstream f;
	f.open("UTF-8.txt");
	f.imbue(std::locale(".65001")); 

    f.open("GBK.txt");
    f.imbue(std::locale(".936"));

设置 UTF-8编码文件 GBK编码文件
fstream(默认) 原始数据 原始数据
fstream(设置了locale) 原始数据 原始数据
wfstream(默认) 原始数据 原始数据
wfstream(设置了locale) 转换为UTF-16(程序中的宽字符类型编码) 转换为UTF-16 (程序中的宽字符编码)

(3) 文件路径编码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

visual studio 2019中文乱码 的相关文章

随机推荐

  • AddBinary[LeetCode]

    掌握了刚才的方法 这类问题都解决了 class Solution public string addBinary string a string b int m a size 1 int n b size 1 int carry 0 str
  • kaggle数据分析实践项目练习——人力资源分析

    学习完 利用python进行数据分析 之后 学习了Numpy pandas matplotlib几个包的使用 于是着手准备在kaggle上找数据集进行练习 在kaggle中找到了人力资源分析项目 看到不少人拿这个项目练手 本文将会分析为何公
  • 【Hadoop系列】linux下 root用户免密码登录远程主机 ssh

    SSH原理 Hadoop系列 linux SSH原理解析 操作环境 CentOS 6 5 操作对象 用户A主机和远程主机B 正文部分 斜体加粗代表linux指令 linux下 非root用户免密码登录远程主机 ssh请转至此链接 XXXXX
  • Linux CentOS7命令及命令行

    Linux CentOS7中命令及命令行是非常重要的概念 对大多数初学者来说是既熟悉又了解甚少 本文初步讨论这方面的内容 与同行者交流 一 命令 命令又称为指令 英语命令 command 可用简写cmd表示 在终端命令行中执行的一段字符 一
  • QT5.14.2+VS2017环境安装

    1 下载Qt5 14 2以及qt vs插件 1 Qt官网下载地址 操作系统是win10企业版 在目录qt下找到程序qt opensource windows x86 5 14 2 exe 在目录vsaddin下找到程序qt vsaddin
  • 时间基础概念及Linux中的时间函数

    时间基础概念及Linux中的时间函数 时间相关概念 GMT 时间 UTC 时间 时区 Time Zone 夏令时 DST 本地时间 localtime Linux 系统中的时间 时钟基础概念 系统节拍数 jiffies Linux系统查看时
  • 生产者与消费者问题?

    生产者消费者模式是并发 多线程编程中经典的设计模式 简单来看 就是一个类负责生产 一个类负责消费 举例来说 一个变量 生产者不断增加这个变量 消费者不断减少这个变量 在互联网应用中 抢票机制就是应用了该模式 比如大麦网演唱会门票抢票 123
  • linux作业后台管理

    参考 http blog itpub net 26736162 viewspace 2142674 常用命令 参考http blog chinaunix net uid 26785297 id 3375270 html fg bg jobs
  • 一文搞清到底什么是 .NET?

    现在各种 NET 满天飞 别说新手了 连我这样的老手都差点被绕进去 到底什么是 NET 呢 通俗易懂 什么是 NET 什么是 NET Framework 什么是 NET Core 这篇文章好长呀 不知道你看完了没有 其实最关键的是核心的几个
  • 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。(C语言)基础版

    输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔 输出格式 在一行中输出两个输入序列的交集序列 数字间用空格分开 结尾不能有多余空格 若新链表为空 输出NULL in
  • session机制详解以及session的相关应用

    session是web开发里一个重要的概念 在大多数web应用里session都是被当做现成的东西 拿来就直接用 但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求 当碰到这样的情况时候我们需要更加深入的理解sessi
  • layui 前端下载文件方法

    文件下载 function downLoadFile ids name 获取token var tableName layui data setter tableName 创建下载请求 var oReq new XMLHttpRequest
  • 学计算机的的用87键键盘可以吗,键盘87和108键区别

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 键盘87和108键区别是 1 87键的键盘有87个按键 108键的键盘有108个按键 2 108键的键盘在87键键盘的基础上增加了17个数字辅助按键和4个功能键 键盘 Ke
  • 【环境配置篇】保姆级教学之Ubuntu20.04上编译OpenCV+CUDA

    保姆级教学之Ubuntu20 04上编译OpenCV CUDA 自从发了上一期在Ubuntu20 04上配置深度学习环境的视频之后 我收到了很多小伙伴的反馈 其中有不少同学私信我表示 能不能教我怎么编译OpenCV呢 但其实在Ubuntu上
  • 【微服务笔记(九)】之Feign,Feign的负载均衡与熔断

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 Feign 一 概述 之前使用Ribbon的负载均衡功能 简化了远程调用时的代码 但是每次调用都需要写基本相同的代码 代码重复性高 Feign可以把Rest的请求进行隐藏 伪装成
  • 【mobx】since strict-mode is enabled,changing (observed) values without using an action is not allowed

    问题描述 在用mobx做react的状态管理工具时 异步获取数据后 虽然页面获取到了数据并且渲染 但是控制台warnning 代码如下 ChannelStore js import makeAutoObservable from mobx
  • Matlab:比较和合并 MAT 文件--方便高效的批量处理

    Matlab 比较和合并 MAT 文件 方便高效的批量处理 MATLAB中 我们常常需要处理大批量的数据 而在处理这些数据时经常需要将多个MAT文件进行比较和合并 本文将介绍如何使用MATLAB的相关函数实现比较和合并MAT文件 一 比较M
  • Window10运行Docker踩过的坑

    Window10运行Docker踩过的坑 摘要 1 Docker for Windows 仅支持专业版 2 docker machine启动docker时 docker里的文件没了 3 docker安装Redis时配置文件出错 最近新装系统
  • Qt: QPushButton 常用样式设置(qss)

    1 设置上边框为2个像素 样式为实线 颜色为黑色 border top 2px solid 000000 2 设置上内边距为 8px 文字向下移动 padding top 8px 3 给文字加下划线 text decoration unde
  • visual studio 2019中文乱码

    文章目录 1 编码 1 code编码 2 控制台编码 3 txt文件编码 4 控制台编码 2 中文输出 1 更改 locale 显示中文 1 cout 与 wcout 2 ofstream 与 wofstream 3 printf 和 wp