|
本帖最后由 Alecvbnm 于 2021-8-14 22:12 编辑
使用vs code, 编译器是mingw-w64,C++标准是C++11,操作系统是win10,以前用vs不会有问题
有一个困扰数月的问题,在各种网站上查了也没解决
大致是使用wcout无法输出非英文宽字符串,似乎是直接导致wcout出现错误,而不是乱码(cstdio的两个输出函数和iostream的两个输出对象的问题是大致一样的)
使用set_locale,wcout.imbue, global等都没法解决问题,其中imbue抛出错误
以下说的窄字节指的是char类型,宽字节是wchar_t,unicode可以指char16_t也可以是char32_t
cout的问题是乱码,在输出任何中文字符(指窄字符串,宽字符串,unicode)时都乱码(在控制台活动页为936的情况下,网上查资料时找到936是指GBK编码,65001是utf-8),使用命令 chcp 65001 修改为活动页65001后正常输出,以上WIN32 API的WriteFile函数也有类似情况,WriteFile函数在将窄字节写入文件后,我以文本文件打开,显示正常(utf-8),但我以GBK编码打开,显示和控制台输出一样
另外在使用vscode调试时,控制台输出就像是和将控制台活动页设置为65001时的输出一样(我没有改动),调试时字符串变量显示也有问题
main.cpp
- #include <iostream>
- //以下基本都是 Hello, World
- #define CHS "你好,世界"
- #define W_CHS L"你好,世界"
- #define UTF8_CHS "\u4F60\u597D\uFF0C\u4E16\u754C"
- #define u_UTF8_CHS u"\u4F60\u597D\uFF0C\u4E16\u754C"
- #define ENG "Hello, world"
- #define W_ENG L"Hello, world"
- #define CE "Hello, world 你好,世界 Hello, world"
- #define W_CE L"Hello, world 你好,世界 Hello, world"
- int main()
- {
- std::cout << "cout CHS -- " << CHS << std::endl;
- std::wcout << L"wcout W_CHS -- " << W_CHS << std::endl;
- std::cout << "cout UTF8_CHS -- " << UTF8_CHS << std::endl;
- std::wcout << L"wcout u_UTF8_CHS -- " << u_UTF8_CHS << std::endl;
- std::cout << "cout ENG -- " << ENG << std::endl;
- std::wcout << L"wcout W_ENG -- " << W_ENG << std::endl;
- std::cout << "cout CE -- " << CE << std::endl;
- std::wcout << L"wcout W_CE -- " << W_CE << std::endl;
-
- return 0;
- }
复制代码
str.cpp
- #include <iostream>
- //以下基本都是 Hello, World
- #define CHS "你好,世界"
- #define W_CHS L"你好,世界"
- #define UTF8_CHS "\u4F60\u597D\uFF0C\u4E16\u754C"
- #define u_UTF8_CHS u"\u4F60\u597D\uFF0C\u4E16\u754C"
- #define ENG "Hello, world"
- #define W_ENG L"Hello, world"
- #define CE "Hello, world 你好,世界 Hello, world"
- #define W_CE L"Hello, world 你好,世界 Hello, world"
- int main()
- {
- setlocale(LC_ALL, "");
-
- std::wcout << W_CHS << std::endl;
- return 0;
- }
复制代码
s.cpp
- #include <iostream>
- int main()
- {
- wchar_t text[] = L"你好,世界";
- std::wcout << text << std::endl;
- return 0;
- }
复制代码
本帖最后由 cpp2019 于 2021-8-14 23:33 编辑
GCC是Linux上的东西,在Windows上还是建议用VS的编译器。
输出字符串的方法有不少,没有必要纠结一个wcout,没有必要在一颗树上吊死!
注意两个文件的编码,尽量别宽窄字符混编,GCC编译器在Windows上没那么好用!
|
上一篇: c++27课作业下一篇: #pragma comment(lib, "Urlmon")无效
|