VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 268|回复: 1

[已解决]C++ 输出非英文字符串出错

[复制链接]
12_avatar_middle
最佳答案
0 
在线会员 发表于 2021-8-14 20:15:01 | 显示全部楼层 |阅读模式
本帖最后由 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
  1. #include <iostream>

  2. //以下基本都是 Hello, World
  3. #define CHS "你好,世界"
  4. #define W_CHS L"你好,世界"
  5. #define UTF8_CHS "\u4F60\u597D\uFF0C\u4E16\u754C"
  6. #define u_UTF8_CHS u"\u4F60\u597D\uFF0C\u4E16\u754C"

  7. #define ENG "Hello, world"
  8. #define W_ENG L"Hello, world"

  9. #define CE "Hello, world 你好,世界 Hello, world"
  10. #define W_CE L"Hello, world 你好,世界 Hello, world"

  11. int main()
  12. {
  13.     std::cout << "cout CHS -- " << CHS << std::endl;
  14.     std::wcout << L"wcout W_CHS -- " << W_CHS << std::endl;
  15.     std::cout << "cout UTF8_CHS -- " << UTF8_CHS << std::endl;
  16.     std::wcout << L"wcout u_UTF8_CHS -- " << u_UTF8_CHS << std::endl;

  17.     std::cout << "cout ENG -- " << ENG << std::endl;
  18.     std::wcout << L"wcout W_ENG -- " << W_ENG << std::endl;

  19.     std::cout << "cout CE -- " << CE << std::endl;
  20.     std::wcout << L"wcout W_CE -- " << W_CE << std::endl;
  21.    
  22.     return 0;
  23. }
复制代码

str.cpp
  1. #include <iostream>

  2. //以下基本都是 Hello, World
  3. #define CHS "你好,世界"
  4. #define W_CHS L"你好,世界"
  5. #define UTF8_CHS "\u4F60\u597D\uFF0C\u4E16\u754C"
  6. #define u_UTF8_CHS u"\u4F60\u597D\uFF0C\u4E16\u754C"

  7. #define ENG "Hello, world"
  8. #define W_ENG L"Hello, world"

  9. #define CE "Hello, world 你好,世界 Hello, world"
  10. #define W_CE L"Hello, world 你好,世界 Hello, world"

  11. int main()
  12. {
  13.     setlocale(LC_ALL, "");
  14.    
  15.     std::wcout << W_CHS << std::endl;

  16.     return 0;
  17. }
复制代码

s.cpp
  1. #include <iostream>

  2. int main()
  3. {
  4.     wchar_t text[] = L"你好,世界";

  5.     std::wcout << text << std::endl;

  6.     return 0;
  7. }
复制代码
最佳答案
31_avatar_small
2021-8-14 23:28:46
本帖最后由 cpp2019 于 2021-8-14 23:33 编辑

GCC是Linux上的东西,在Windows上还是建议用VS的编译器。

输出字符串的方法有不少,没有必要纠结一个wcout,没有必要在一颗树上吊死!

注意两个文件的编码,尽量别宽窄字符混编,GCC编译器在Windows上没那么好用!
C++ 输出非英文字符串出错
C++ 输出非英文字符串出错
字符串输出 65001 no locale.png.jpg
set_locale.png.jpg
global locale.png.jpg
CPP 字符串输出 936 no locale.png.jpg
936 imbue chs.png.jpg
936 imbue   .png.jpg
vscode调试.png.jpg
gdb调试2.png.jpg
gdb调试.png.jpg




上一篇:c++27课作业
下一篇:#pragma comment(lib, &quot;Urlmon&quot;)无效
31_avatar_middle
最佳答案
49 
在线会员 发表于 2021-8-14 23:28:46 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 cpp2019 于 2021-8-14 23:33 编辑

GCC是Linux上的东西,在Windows上还是建议用VS的编译器。

输出字符串的方法有不少,没有必要纠结一个wcout,没有必要在一颗树上吊死!

注意两个文件的编码,尽量别宽窄字符混编,GCC编译器在Windows上没那么好用!
C++ 输出非英文字符串出错
C++ 输出非英文字符串出错
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-10-23 16:33

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表