C++使用wcin读取带重音葡萄牙语字符出现乱码如何解决
问题原因
你仅对输出流wcout配置了UTF-8编码的locale,输入流wcin没有对应配置,终端输入的UTF-8格式的多字节特殊字符,会被wcin按单字节逐个解析为宽字符,最终导致两个字节的é被拆成两个错误的宽字符输出,就是你看到的é类乱码。
修复方案
1. 统一为wcin也配置相同的UTF-8 locale
修复后的完整代码如下:
#include <iostream> #include <string> #include <locale> #include <iomanip> using namespace std; int main(int, const char *[]) { setlocale(LC_ALL, "en_US.UTF-8"); locale accents("en_US.UTF-8"); // 同时给输入输出流设置locale wcout.imbue(accents); wcin.imbue(accents); wstring belgium, italy; belgium = L"bélgica"; italy = L"itália"; wcout << L"Result: " << setw(15) << belgium << endl; wcout << L"Result: " << setw(15) << italy << endl; wcout << L"Result: " << setw(15) << L"portugal" << endl << endl; wcout << L"Input 'bélgica itália': "; wcin >> belgium >> italy; wcout << L"Result: " << setw(15) << belgium << endl; wcout << L"Result: " << setw(15) << italy << endl; wcout << L"Result: " << setw(15) << L"portugal" << endl; return 0; }
2. 不同环境适配注意事项
- Linux/macOS环境下上述代码可直接运行,如需简化配置,也可以直接调用
locale::global(locale("en_US.UTF-8"))设置全局locale,所有标准流会默认继承该配置,不需要单独为wcout、wcin执行imbue操作。 - Windows环境下如果
en_US.UTF-8不生效,可以替换为".UTF-8"或"en-US.UTF-8";如果使用旧版cmd终端,运行程序前需要先执行chcp 65001切换到UTF-8代码页。
内容的提问来源于stack exchange,提问作者Nuno
相关产品推荐
相关产品推荐

