2016-05-27 13 views
1

Mit Qt/C++ muss ich eine Zeichenfolge mit nur einer Teilmenge von ASCII-Zeichen generieren: Buchstaben, Ziffern, Bindestrich, Unterstrich, Punkt oder Doppelpunkt.Ersetzen Sie alle Nicht-ASCII-Zeichen in einer Zeichenfolge durch ihre ASCII-Entsprechung

Als Eingabe kann ich alles haben.

Also versuche ich, einige Regeln gelten:

  • jeder QChar :: isspace wird mit einem Unterstrich
  • alle Nicht-ASCII-Zeichen mit einem ASCII-Äquivalent (Beispiel ersetzt wird ersetzt: „é“ wird mit „e“)
  • ersetzt wird
  • jeder andere nicht-ASCII-Zeichen

gibt es eine einfache Möglichkeit, mit Qt/C++ entfernt werden die zweite und die dritte Regel anzuwenden?

Danke

+0

Wenn Sie etwas als eine Eingabe haben kann, was für '' 嗨 Charakter sein Ersatz sollte, zum Beispiel? – vahancho

+0

Dies ist möglich, aber Sie müssten eine Unicode-Zeichenkodierung in der Datenbank tatsächlich auf Ihre ANSI-Entsprechungen beschränken. Windows verfügt dazu über eine Betriebssystem-API namens 'WideCharToMultiByte'. Ich bin mir nicht sicher, ob etwas in Qt eingebaut ist. leicht genug zu sagen, indem Sie die Dokumentation konsultieren. Im Allgemeinen besteht die Strategie darin, "unbekannte" Zeichen durch ein generisches Zeichen zu ersetzen, wie das rechteckige Kästchen oder ein einfaches Fragezeichen, anstatt sie einfach zu entfernen, wie es Ihre Regel # 3 vorschlägt. Aber du kannst tun, was du willst; im Allgemeinen nimmt die API eine Flagge. –

+0

@vahancho: mit den "einfachen" Regeln, die ich verwenden möchte, entferne sie einfach. Ich habe eine bessere Wahl, ich bin offen! – Aurelien

Antwort

4

Ja, es gibt einen Weg. Zuerst sollten Sie die Unicode-Normalisierung Ihrer Zeichenfolge mit QString::normalized vornehmen. Normalisierung wird benötigt, um diakritische Zeichen von Buchstaben zu trennen und einige fancy Symbole durch ASCII Äquivalente zu ersetzen. Here können Sie über Normalisierungsformen lesen.

Dann können Sie Zeichen nehmen, die in Latin-1 kodiert werden können. Kann mit toLatin1 Methode von QChar getestet werden.

char QChar :: toLatin1() const

Gibt den Latin-1 Zeichen entspricht dem QChar oder 0. Diese für nicht-internationalisierten Software vor allem nützlich ist.

...

QString testString = QString::fromUtf8("Ceñía-üÏÖ马克ñ"); 
QString normalized = testString.normalized(QString::NormalizationForm_KD); 
QString result; 

copy_if(normalized.begin(), normalized.end(), back_inserter(result), [](QChar& c) { 
    return c.toLatin1() != 0; 
}); 

qDebug() << result; // Cenia-uIOn 
+1

Einfacher Code, und macht den Job. Ich mag das. Vielen Dank. – Aurelien

Verwandte Themen