繁体   English   中英

getline()不能正确读取重音字符

[英]getline() doesn't read accented characters correctly

我正在尝试使用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;
}

当我输入:MarkCoração时,这就是我得到的:

重音字符无法正确显示

我如何解决它?

实际上,问题不是来自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()

std::wstring a;
getline(std::wcin, a)
std::wcout << a << std::endl;

我希望它可以提供帮助。

同一问题有两个级别。 问题是您使用的是ASCII字符集之外的字符。 这两个级别是:

  • 它们如何在输入时转换为窄字符
  • 它们将如何显示在输出上

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

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

因此,如果可能的话,你应该尝试用非英语西方的eurapean语言来配置系统(葡萄牙语会很好,但法语似乎已经足够了,所以我认为西班牙语也会这样)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM