簡體   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