You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:48:01