2017-06-27 4 views
1

Was ist der empfohlene Weg, um einige Benutzereingaben zu lesen, die Sonderzeichen mit beispielsweise haben kann, Akzent, wenn es nicht bekannt, bei welcher locale es eingegeben wird.Wie sicher und portabel Eingang und prüft für die Akzentzeichen

Wie sicher einen Charakter dieses Benutzereingabe vergleichen, wenn sie eine besondere ist, dass ich eine Art und Weise zu handhaben müssen?

Dies ist ein Beispielcode, die Absicht zu verdeutlichen:

#include <iostream> 
using namespace std; 

int main() { 
    char txt[10]; 
    cin.getline(txt, sizeof(txt)); 
    if(txt[0] == 'á') 
     cout << "Special character found\n"; 
} 

Das Problem ist:

warning: multi-character character constant [-Wmultichar] 
    if(txt[0] == 'á') 
       ^

Wenn ich L'á' so breit Zeichenliteral verwenden, dann wird es nicht passen, da der Eingang ist nicht breit.

Wenn ich auch wchar_t und wcin.getline benutze, um Benutzereingaben in Wide-Zeichen zu erhalten, dann kann es bei einigen Systemen funktionieren und bei anderen nicht, abhängig von der Umgebung und den Ländereinstellungen.

Wie sicher und portabel über dieses Problem zu bekommen? Vielen Dank!

+2

Vielleicht möchten Sie mit einer Unicode-Bibliothek wie [ICU] (http://site.icu-project.org/) – NathanOliver

+0

der beste Ansatz, oder unser Favorit betrachten ? Ich bin gut mit UTF8 intern gegangen, in Windows muss ich für UI-Anzeige und Eingabe in UTF-16 konvertieren, aber es lohnt sich. Ich habe ausschließlich 'boost :: locale :: conv :: utf_to_utf' verwendet, um die Conversions durchzuführen. –

Antwort

1

Wenn Sie beide nicht Ihren Ort kennen und haben Ihre Lösung tragbar machen, dann bin ich fürchte, es gibt keine Standard-C++ Lösung dafür. Und ich bin nicht sicher, dass es jemals da sein wird, unter Berücksichtigung von Windows mit UTF-16. Wenn Sie also eine "Out-of-Box-Lösung" benötigen, ist es wahrscheinlich sinnvoll, die unter NathanOliver's comment genannte Bibliothek zu überprüfen.

Obwohl, obwohl Unicode-Unterstützung immer noch ein Schwachpunkt von C++ bleibt (und es ist wirklich traurig, dass ich diese Wörter im Jahr 2017 schreibe), gibt es bestimmte Verbesserungen, die mit C++ 11 kam.

So im Falle manuelle Konvertierung ist eine Option für Sie, Sie von einigen seiner Leckereien profitieren können.

Zum Beispiel, hier ist ein gültiger C++ 11-Code.

unsigned char euroUTF8[] = { 0xE2, 0x82, 0xAC, 0x00 }; // Euro sign UTF8 

wstring_convert<codecvt_utf8<wchar_t>> converter_UTF8_wchar; 
wstring euroWideStr = converter_UTF8_wchar.from_bytes((char*)euroUTF8); 
wcout << euroWideStr << endl; 

string euroNarrowStr = converter_UTF8_wchar.to_bytes(euroWideStr); 
cout << euroNarrowStr << endl; 

Weitere Kontextprüfung this article