So entfernen Sie Akzente und tilde in C++ std::string
Ich habe ein problem mit einem string in C++, das hat mehrere Wörter in Spanisch. Dies bedeutet, dass ich eine Menge von Wörtern mit Akzenten und Tilden. Ich möchte Sie ersetzen, die für Ihre nicht akzentuierten Entsprechungen. Beispiel: ich will ersetzen Sie das Wort: "había" für habia. Ich habe versucht, ersetzen Sie es direkt, aber mit replace-Methode der string-Klasse, aber ich konnte nicht bekommen, um zu arbeiten.
Ich bin mit diesem code:
for (it= dictionary.begin(); it != dictionary.end(); it++)
{
strMine=(it->first);
found=toReplace.find_first_of(strMine);
while (found!=std::string::npos)
{
strAux=(it->second);
toReplace.erase(found,strMine.length());
toReplace.insert(found,strAux);
found=toReplace.find_first_of(strMine,found+1);
}
}
Wo dictionary
ist eine Karte wie diese (mehr Einträge):
dictionary.insert ( std::pair<std::string,std::string>("á","a") );
dictionary.insert ( std::pair<std::string,std::string>("é","e") );
dictionary.insert ( std::pair<std::string,std::string>("í","i") );
dictionary.insert ( std::pair<std::string,std::string>("ó","o") );
dictionary.insert ( std::pair<std::string,std::string>("ú","u") );
dictionary.insert ( std::pair<std::string,std::string>("ñ","n") );
sowie toReplace
Saiten:
std::string toReplace="á-é-í-ó-ú-ñ-á-é-í-ó-ú-ñ";
Muss ich offensichtlich etwas fehlen. Ich kann ' T es herausfinden.
Gibt es eine Bibliothek, die ich verwenden kann?.
Dank,
Sollten Sie die Plattform, die Sie sind targeting (Windows, Linux, usw.), und die Codierung, die Sie sind targeting (UTF-8, UTF-16, was auch immer). Zum Beispiel, Ihre "á" ist Glyphe ' E1, was übersetzt 'á' auf USO-8859-1 char L'á' auf UTF-16 wchar_t, aber "á" (ja, die beiden chars) auf UTF-8
Sorry... Von der Zeit bekam ich zurück, um Ihre post (von der Suche auf Unicode.org) und validiert den Kommentar, du hast Antwort...
Dies ist ein Duplikat von <a href="stackoverflow.com/questions/140422/..."> Wie übersetze ich " 8bit-Zeichen in 7-bit-Zeichen? (also Ü zu U) </a>.
Sorry... Von der Zeit bekam ich zurück, um Ihre post (von der Suche auf Unicode.org) und validiert den Kommentar, du hast Antwort...
Dies ist ein Duplikat von <a href="stackoverflow.com/questions/140422/..."> Wie übersetze ich " 8bit-Zeichen in 7-bit-Zeichen? (also Ü zu U) </a>.
InformationsquelleAutor Alejo | 2008-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, dies ist eine wirklich schlechte Idee: du bist mangeln jemandes Sprache durch das entfernen von Buchstaben. Obwohl die extra Punkte in Worten wie "naiv" scheinen überflüssig zu Menschen, die nur Englisch sprechen, gibt es buchstäblich Tausende von Schriftsystemen in der Welt, in der solche Unterscheidungen sind sehr wichtig. Das schreiben von software zu verstümmeln jemandem Rede legt Sie direkt auf der falschen Seite von der Spannung zwischen der Verwendung von Computern als Mittel zur Erweiterung der Bereich der menschlichen Ausdrucks-vs.-Werkzeuge der Unterdrückung.
Was ist der Grund, warum man versucht, dies zu tun? Ist etwas weiter unten auf die Linie Würgen auf die Akzente? Viele Menschen würden gerne helfen, Sie zu lösen.
Sagte, libicu kann dies für Sie tun. Öffnen Sie die verwandeln demo; kopieren und fügen Sie den spanischen text in die "Input" - Feld; geben Sie
als "Compound 1" und klicken Sie auf Transformation.
(Mit Hilfe von Folie 9 von Unicode Transformiert in ICU. Folien 29-30 zeigen, wie die API zu verwenden.)
Wie auch immer, ich denke, es ist eine gute Lösung der Intensivstation
Der rechten Maustaste auf! Akzente und Tilden sind es nicht zu süß; hacken Sie ab, ändert die Bedeutung des Textes. "Habia" ist nicht ein Wort, aber "había" ist. "Nicht" ist "Persönlichkeit"; eine "Art" ist ein symbol gedruckt. "Cana" ist ein weißer Haare; "Caña" ist ein Spazierstock. "Peso" ist ein Substantiv. "Pesó" ist ein verb.
Durch die Art und Weise. Ich fand diese Seite, die erklärt, wie Sie mithilfe der Intensivstation Transliterator: markcmusic.com/blog/2008/08/28/using-the-icu4c-transliterator
Während das stimmt in der Theorie, in der Praxis viele Spanisch Sprechende nicht die Mühe, mit Akzenten oder erhalten Sie Sie einfach wrogn (IM in den Sinn kommt) und die Bedeutung ist immer noch klar. Es ist wie das/es ist, Sie sind/Ihr, etc in Englisch. Mit Ihnen falsch ist, zeigt ein bisschen fahrlässig, aber selten zu Missverständnissen.
InformationsquelleAutor andrewdotn
Ich bin nicht einverstanden mit den derzeit in "genehmigt" zu beantworten. Die Frage macht durchaus Sinn, wenn Sie die Indizierung von text. Wie groß- /Kleinschreibung zu suchen, accent-insensitive-Suche ist eine gute Idee. "naiv" entspricht "Naiv" entspricht "naiv" entspricht "NAIV" (Sie tun wissen, dass ein großes i ist, die ich in Türkisch? Das ist, warum Sie ignorieren Akzente)
Nun, den besten Algorithmus angedeutet wird, wird durch die genehmigte Antwort: Verwenden Sie NKD (Zersetzung) zu zerlegen akzentuierte Buchstaben in den sockel ein Brief und ein separates Akzent, und entfernen Sie dann alle Akzente.
Gibt es wenig Sinn, in der re-Komposition, danach, wenn. Sie entfernt die meisten Sequenzen, die ändern würde, und die anderen sind für alle Absichten und Zwecke identisch sowieso. Was ist der Unterschied zwischen æ in der NKC und æ im NKD?
Eigentlich ist es nicht. Unicode-ZERLEGUNG von bär gibt ba"r (mit einer extra-codepoint für den umlaut), nicht Bär. Remmeber, dass Unicode-ZERLEGUNG ist locale-unabhängig. ä = ae ist ein deutscher, aber nicht wie eine Niederländische Zersetzung.
Ich denke du meinst 'ich', nicht '*' Kapital 'ich'.
Sorry, behoben.
href="http://unicode.org/reports/tr15/" >Unicode Standard Annex #15
InformationsquelleAutor MSalters
Ich denke auf jeden Fall sollten Sie schauen, in die Wurzel des Problems. Das heißt, nach einer Lösung suchen, die Ihnen erlauben, mit den Zeichen in Unicode kodiert oder für das Gebietsschema des Benutzers.
Dass gesagt wird, Ihr problem ist, dass man sich mit multi-character-Zeichenfolgen. Es ist
std::wstring
aber ich bin mir nicht sicher, ob ich die verwenden. Für eine Sache, die breiten Zeichen nicht verarbeiten können soll, variabler Breite Codierungen. Das Loch geht tief, also werde ich es dabei belassen.Nun den rest Ihres Codes, es ist auch fehleranfällig, weil Sie mischen die Schleife Logik mit übersetzung Logik. Also, mindestens zwei Arten von Fehlern können auftreten: translation bugs und looping bugs. Verwenden Sie die STL, kann es Ihnen helfen, eine Menge mit der looping Teil.
Folgende ist eine grobe Lösung für das ersetzen der Zeichen in einer Zeichenfolge.
main.cpp:
translate_characters.h:
translate_characters.cpp:
InformationsquelleAutor wilhelmtell
Möchten Sie vielleicht zu prüfen, den boost (http://www.boost.org/) Bibliothek.
Es hat eine regexp-Bibliothek, die Sie nutzen könnten.
Darüber hinaus hat es eine bestimmte Bibliothek, die einige Funktionen zur string-manipulation (link) einschließlich ersetzen.
InformationsquelleAutor Johan
Versuchen Sie es mit std::wstring statt std::string. UTF-16 funktionieren sollte (im Gegensatz zu ASCII).
InformationsquelleAutor
Wenn Sie können (wenn Sie mit Unix), schlage ich vor, den
tr
Anlage: es ist maßgeschneidert für diesen Zweck. Denken Sie daran, keine Codes == keine fehlerhafte code. 🙂Edit: Sorry, du hast Recht,
tr
scheint nicht zu funktionieren. Wie wäresed
? Es ist eine ziemlich dumme script, das ich geschrieben habe, aber es funktioniert für mich.InformationsquelleAutor Chris Jester-Young
Konnte ich den link nicht die ICU-Bibliotheken, aber ich denke immer noch, es ist die beste Lösung. Wie muss ich dieses Programm funktionsfähig sein, so schnell wie möglich machte ich ein kleines Programm (das muss ich noch verbessern) und ich werde es auch benutzen. Danke Euch allen für die Anregungen und Antworten.
Hier der code, ich bin gonna verwenden:
Ich es das nächste mal ich muss mein Programm für die Korrektur (in etwa 6 Wochen).
InformationsquelleAutor Alejo
InformationsquelleAutor vince