吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 402|回复: 9
收起左侧

[求助] 大佬们请问c++ getline如何从控制台读入一行中文字符串

[复制链接]
你好,再见 发表于 2024-5-15 17:11
大佬们请问c++ getline如何从控制台读入一行中文字符串

网上搜了一大圈方案都不管用,问了gpt也不行
代码文件为UTF-8编码,同时已经设置控制台编码为UTF-8
按照下列代码读入中文字符串会乱码
网上的方案包括用wcin读入wstring然后转成string,还有std::wcin.imbue(std::locale(""));,还有UTF8转GBK都试过了不行
萌新不懂求教,或者说有什么其它好方法能够读入一行中文字符串


[C++] 纯文本查看 复制代码
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
std::string Path;
getline(std::cin, Path);
std::cout << Path << std::endl;

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

小小娃娃 发表于 2024-5-15 17:35
[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>

int main()
{
    std::string Path;
    std::getline(std::cin, Path);
    std::cout << Path << std::endl;
}



我并没有修改你的代码,我使用VS2022

屏幕截图 2024-05-15 173416.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
你好,再见 + 1 + 1 感谢大佬点拨,单独拿出来执行的确没问题

查看全部评分

kai-memory 发表于 2024-5-15 17:44
有没有编译好的exe文件打包发出来,最好乱码状态的截图一起发出来

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
你好,再见 + 1 + 1 热心回复!

查看全部评分

xiao14116 发表于 2024-5-15 18:32
函数声明:ssize_t getline(char **lineptr, size_t *n, FILE *stream);
从这个声明中就能看出,getline只接受ANSI编码,所以UTF-8编码自然会出乱码。
文件中用UTF-8编码,读取到以后想要正常显示需要转换为ANSI编码以后再显示

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
你好,再见 + 1 + 1 用心讨论,共获提升!

查看全部评分

 楼主| 你好,再见 发表于 2024-5-15 20:15
本帖最后由 你好,再见 于 2024-5-15 20:16 编辑
xiao14116 发表于 2024-5-15 18:32
函数声明:ssize_t getline(char **lineptr, size_t *n, FILE *stream);
从这个声明中就能看出,getline只 ...

感谢大佬,这是我的原始代码
受到一楼大佬点拨,我把19-21行代码单独拿出来执行是能够正确读入中文的

捕获1.PNG


先前我尝试去除10-12行代码,结果仍然无法读入中文,我就一直认为是getline的问题
现在我注释掉第17行代码后就正常了,先前一直没在意第17行输出为什么会少了个回车
捕获2.PNG


捕获3.PNG


单独注释掉第12行
捕获4.PNG

目前的解决方案是cout完之后重新把控制台编码设置为GBK
所以大佬求教第17行代码是什么问题

[C++] 纯文本查看 复制代码
    SetConsoleOutputCP(CP_UTF8);    //设置控制台输入编码为UTF-8
    //SetConsoleCP(CP_UTF8);

    std::cout << "***Created by Michael***" << std::endl << std::endl;
    std::cout << "使用提示:" << std::endl;
    std::cout << "1、访问高权限文件夹会报错退出" << std::endl;
    std::cout << "2、请输入文件夹路径例如:\"D:\\Folder\"" << std::endl;

    SetConsoleOutputCP(936);
    //SetConsoleCP(936);
    std::string Path;
    getline(std::cin, Path);
    std::cout << Path << std::endl;

apull 发表于 2024-5-15 20:47
给 g++加编译参数  -finput-charset=utf-8 -fexec-charset=utf-8 或gbk
小小娃娃 发表于 2024-5-15 22:16
你好,再见 发表于 2024-5-15 20:15
感谢大佬,这是我的原始代码
受到一楼大佬点拨,我把19-21行代码单独拿出来执行是能够正确读入中文的

...

有没有可能不是代码的问题
而是配置有问题
[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>
#include <windows.h>

int main()
{
    //SetConsoleOutputCP(CP_UTF8);    //设置控制台输入编码为UTF-8
    //SetConsoleCP(CP_UTF8);

    std::cout << "***Created by Michael***" << std::endl << std::endl;
    std::cout << "使用提示:" << std::endl;
    std::cout << "1、访问高权限文件夹会报错退出" << std::endl;
    std::cout << "2、请输入文件夹路径例如:\"D:\\Folder\"" << std::endl;

    //SetConsoleOutputCP(936);
    //SetConsoleCP(936);
    std::string Path;
    getline(std::cin, Path);
    std::cout << Path << std::endl;
}


屏幕截图 2024-05-15 221429.png
 楼主| 你好,再见 发表于 2024-5-16 00:13
小小娃娃 发表于 2024-5-15 22:16
有没有可能不是代码的问题
而是配置有问题
[mw_shl_code=cpp,true]#include

乃的代码文件是GBK编码吗可能没有这个问题,调整成UTF-8试一试
控制台是GBK然后我cout的中文又是UTF-8,而后getline按照单字节读入字符串就产生了一些错误
总之这个编码问题真是折腾人
ppxxcc 发表于 2024-5-16 03:12
编码问题是一个大坑,和编译器、终端、系统的编码环境都有关系
kai-memory 发表于 2024-5-16 05:55
因为没有乱码文本,刚才找了网站确定乱码文字对应关系
这是网站地址http://www.mytju.com/classcode/tools/messyCodeRecover.asp从结果看应该是UTF8的内容按照gbk解析显示了,可以顺着这个方向继续看看哪里有问题

QQ截图20240516052627.png
PS:代码测试了用的vs 2022 把SetConsoleOutputCP(CP_UTF8); 注释掉汉字是正常的,但是乱码内容和楼主的不一样
之前也在编码问题上踩过坑,经排查因为当初图为了用某些东西方便,地区和语言选的不太常规。
后面干脆为了避免这些问题,掩耳盗铃尽量不用中文
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-29 16:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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