大佬们请问c++ getline如何从控制台读入一行中文字符串
大佬们请问c++ getline如何从控制台读入一行中文字符串网上搜了一大圈方案都不管用,问了gpt也不行{:301_971:}
代码文件为UTF-8编码,同时已经设置控制台编码为UTF-8
按照下列代码读入中文字符串会乱码
网上的方案包括用wcin读入wstring然后转成string,还有std::wcin.imbue(std::locale(""));,还有UTF8转GBK都试过了不行
萌新不懂求教,或者说有什么其它好方法能够读入一行中文字符串
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
std::string Path;
getline(std::cin, Path);
std::cout << Path << std::endl; #include <iostream>
#include <string>
int main()
{
std::string Path;
std::getline(std::cin, Path);
std::cout << Path << std::endl;
}
我并没有修改你的代码,我使用VS2022
https://attach.52pojie.cn//forum/202405/15/173543y2xii2jjvdij335c.png?l 有没有编译好的exe文件打包发出来,最好乱码状态的截图一起发出来 函数声明:ssize_t getline(char **lineptr, size_t *n, FILE *stream);
从这个声明中就能看出,getline只接受ANSI编码,所以UTF-8编码自然会出乱码。
文件中用UTF-8编码,读取到以后想要正常显示需要转换为ANSI编码以后再显示 本帖最后由 你好,再见 于 2024-5-15 20:16 编辑
xiao14116 发表于 2024-5-15 18:32
函数声明:ssize_t getline(char **lineptr, size_t *n, FILE *stream);
从这个声明中就能看出,getline只 ...
感谢大佬,这是我的原始代码
受到一楼大佬点拨,我把19-21行代码单独拿出来执行是能够正确读入中文的
先前我尝试去除10-12行代码,结果仍然无法读入中文,我就一直认为是getline的问题
现在我注释掉第17行代码后就正常了,先前一直没在意第17行输出为什么会少了个回车
单独注释掉第12行
目前的解决方案是cout完之后重新把控制台编码设置为GBK{:301_971:}
所以大佬求教第17行代码是什么问题
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;
给 g++加编译参数-finput-charset=utf-8 -fexec-charset=utf-8 或gbk 你好,再见 发表于 2024-5-15 20:15
感谢大佬,这是我的原始代码
受到一楼大佬点拨,我把19-21行代码单独拿出来执行是能够正确读入中文的
...https://attach.52pojie.cn//forum/202405/15/221657pjebbttzym7i94jb.png?l
有没有可能不是代码的问题
而是配置有问题
#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-5-15 22:16
有没有可能不是代码的问题
而是配置有问题
#include
乃的代码文件是GBK编码吗可能没有这个问题,调整成UTF-8试一试
控制台是GBK然后我cout的中文又是UTF-8,而后getline按照单字节读入字符串就产生了一些错误
总之这个编码问题真是折腾人{:301_1008:} 编码问题是一个大坑,和编译器、终端、系统的编码环境都有关系 因为没有乱码文本,刚才找了网站确定乱码文字对应关系
这是网站地址http://www.mytju.com/classcode/tools/messyCodeRecover.asp从结果看应该是UTF8的内容按照gbk解析显示了,可以顺着这个方向继续看看哪里有问题
PS:代码测试了用的vs 2022 把SetConsoleOutputCP(CP_UTF8); 注释掉汉字是正常的,但是乱码内容和楼主的不一样
之前也在编码问题上踩过坑,经排查因为当初图为了用某些东西方便,地区和语言选的不太常规。
后面干脆为了避免这些问题,掩耳盗铃尽量不用中文
页:
[1]