5 Stimmen

UTF-8 in ASCII mit der ICU-Bibliothek umwandeln

Ich habe einen std::string mit UTF-8-Zeichen darin.
Ich möchte den String in die am nächsten liegende Äquivalenz mit ASCII-Zeichen konvertieren.

Zum Beispiel:

ód => Lodz
Assunção => Assuncao
Schloß => Schloss

Leider ist die ICU-Bibliothek wirklich unintuitiv und ich habe keine gute Dokumentation über ihre Verwendung gefunden, also würde es zu lange dauern, es zu lernen. Zeit, die ich nicht habe.

Könnte jemand ein kleines Beispiel geben, wie dies gemacht werden kann??
Danke.

4voto

Versuchen Sie das, ucnv_convert("US-ASCII", "UTF-8", Ziel, Zielgröße, Quelle, Quellengröße, pError)

3voto

shoosh Punkte 73374

Ich weiß nichts über ICU, aber ICONV macht das und es ist ziemlich einfach zu erlernen. Es sind nur etwa 3-4 Aufrufe erforderlich und was du in deinem Fall brauchst, ist die Verwendung des ICONV_SET_TRANSLITERATE Flags mit iconvctl().

1voto

Steven R. Loomis Punkte 4580

Ich habe einen Rückruf geschrieben, der entkomponiert und dann einige Ersetzungen vornimmt. Es könnte wahrscheinlich als Transliteration implementiert werden. Der Code befindet sich hier decompcb.c und der Header ist in der Nähe. Installieren Sie es wie folgt auf einem Unicode-zu-ASCII-Konverter:

ucnv_setFromUCallBack(gConverter, &UCNV_FROM_U_CALLBACK_DECOMPOSE, &status);

verwenden Sie dann gConverter, um von Unicode nach ASCII zu konvertieren

0voto

OJ. Punkte 28189

Dies ist kein Bereich, in dem ich ein Experte bin, aber wenn Sie keine Bibliothek zur Hand haben, die dies für Sie einfach erledigt, dann erstellen Sie möglicherweise besser einfach eine Lookup-Tabelle/Map, die die UTF-8 -> ASCII-Werte enthält. d.h. Der Schlüssel ist das UTF-8-Zeichen, der Wert ist die ASCII-Sequenz von Zeichen.

0voto

MSalters Punkte 166675

Die ß->ss-Zerlegung sagt mir, dass du die Kompatibilitätszerlegung möchtest. In ICU brauchst du die Klasse Normalizer dafür. Danach landest du bei etwas wie L'odz'. Aus diesem String kannst du einfach die nicht-ASCII-Zeichen entfernen. Keine Notwendigkeit für ICU, der einfache STL reicht aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X