C++ getline()不';不能正确读取重音字符

C++ getline()不';不能正确读取重音字符,c++,getline,non-ascii-characters,C++,Getline,Non Ascii Characters,我试图使用getline()命令从用户处获取重音字符,但它无法正确打印它们 我试图将一些库作为locale,但没有成功 这是我的密码: #include <iostream> #include <cstdlib> #include <string> #include <locale> using namespace std; class Pers { public: string name; int age; strin

我试图使用
getline()
命令从用户处获取重音字符,但它无法正确打印它们

我试图将一些库作为
locale
,但没有成功

这是我的密码:

#include <iostream>
#include <cstdlib>
#include <string>
#include <locale>

using namespace std;

class Pers {
public:
    string name;
    int age;
    string weapon;
};

int main()
{
    setlocale(LC_ALL, "");
    Pers pers;

    cout << "Say the name of your character: ";
    getline(cin, pers.name);
    cout << pers.name;
}
#包括
#包括
#包括
#包括
使用名称空间std;
班长{
公众:
字符串名;
智力年龄;
弦武器;
};
int main()
{
setlocale(LC_ALL,“”);
Pers Pers;

cout同一问题有两个级别。问题是您使用的字符超出了ASCII字符集。这两个级别是:

  • 如何在输入时将其转换为窄字符
  • 它们在输出上的显示方式
Windows console在这方面是一个相当令人不安的应用程序:它能够在内部处理UCS2字符,这是基本多语言平面中的任何unicode字符,与代码点最多为0xFFFF的任何字符不同。在输入到窄字符时,它尝试映射当前字符中未表示的任何字符与它认为的更接近,在输出时,它只输出其当前字符集中每个字节的值。因此,最可靠的方法是确保当前区域设置具有正确的排序顺序,并且控制台具有正确的代码页(Windows语言中的字符集).在看到显示的输出后,我假设您使用的是代码页437,其中包含半图形字符,但很少有非ascii字符

由于您只需要西欧字符,我建议您使用代码页1252。它是标准拉丁字符集或ISO-8859-1字符集(代码点最多为0xFF的字符)的Windows变体

因此,如果可能的话,您应该尝试用非英语的west eurapean语言配置系统(葡萄牙语可以,但法语似乎足够了,所以我认为西班牙语也可以)

您必须在正确的代码页中配置控制台:
chcp 1252


如果这还不够(我目前无法测试任何东西),您可以尝试使用宽字符(
wstring
wcin
wcout
)。但如果不更改437的代码页,控制台将不会显示重音字符。

实际上,问题并不是来自
getline()

std::cout
(分别
std::cin
)不支持特殊字符。为此,必须使用使用宽字符的
std::wcout
(分别
std::wcin
)(标准字符的大小限制您在ascii表中可以找到的字符).
您也需要使用较大的字符来存储特殊字符,这是宽字符的情况。
std::string
处理标准字符,
std::wstring
处理宽字符

实现这一点的方法可以是:

std::wstring a(L"Coração");
std::wcout << a << std::endl;

我希望它能有所帮助。

getline
不打印任何字符。请编辑标题。好的,我更改了它。可能相关:可能相关:。我发现很遗憾,似乎无法将Unicode字符输出到此窗口,更改应用程序中的区域设置是一个糟糕的第二选择。它几乎可以正常工作。字符ã是di作为一个八字,上面没有瓷砖。对我来说,它工作得很好,我认为你的控制台和我的设置不一样。
std::wstring a;
getline(std::wcin, a)
std::wcout << a << std::endl;