Wie die Arbeit mit UTF-8 in C++, Konvertierung von anderen Encodings auf UTF-8
Ich weiß nicht, wie zu lösen:
Vorstellen, wir haben 4 websites:
- EIN: UTF-8
- B: ISO-8859-1
- C: ASCII -
- D: UTF-16
Mein Programm in C++ geschrieben, tut Folgendes: Sie lädt eine Webseite und analysiert Sie. Aber es muss den Inhalt verstehen. Mein problem ist nicht die Analyse, die gemacht wird mit ASCII-Zeichen wie ">"
oder "<"
.
Das problem ist, dass das Programm finden alle Wörter aus der website ist text. Ein Wort ist eine beliebige Kombination von alphanumerischen Zeichen.
Dann sende ich diese Worte zu einem server. Die Datenbank und das web-frontend UTF-8.
Also meine Fragen sind:
- Wie kann ich umwandeln "alle" (oder die meisten verwendet) die Zeichenkodierung auf UTF-8?
- Wie kann ich die Arbeit mit UTF-8-strings in C++? Ich denke
wchar_t
funktioniert nicht, weil es ist 2 bytes lang. Code-Punkte, die in UTF-8 bis zu 4 Byte lang... - Gibt es Funktionen wie
isspace()
,isalnum()
,strlen()
,tolower()
für solche UTF-8-strings?
Bitte beachten: ich mache nicht jede Ausgabe(wie std::cout
) in C++. Nur die Filterung des aus die Worte und senden Sie Sie an den server.
Weiß ich über UTF8-CPP, aber es hat keine is*()
Funktionen. Und wie ich gelesen habe, es konvertiert nicht von anderen Zeichencodierungen nach UTF-8. Nur von UTF-* auf UTF-8.
Edit: ich vergaß zu sagen, dass das Programm portable: Windows, Linux, ...
- Ein gutes cross-Plattform-Bibliothek für die Bearbeitung von Unicode (codepoint Eigenschaften, Zeichensatz-Konvertierungen etc.) ist IBM ICU obwohl es ist wahrscheinlich overkill für Ihre Bedürfnisse.
- Ich denke, wchar_t funktioniert nicht, weil es ist 2 bytes lang => es ist schlimmer, als dass
wchar_t
ist compiler - /Ziel spezifische, mit MSVC es werden 2 bytes lang, aber mit gcc und clang es ist 4 bytes lang. - viele Projekte und Produkte, die ICU verwenden, nur für die Funktionen für die Konvertierung, so würde ich nicht denken, es als overkill. Sie konnte nur die Allgemeine Bibliothek oder auch statisch verknüpft werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ICU (International Components for Unicode) ist hier die Lösung. Es ist allgemein als das Letzte Wort in Unicode-Unterstützung. Sogar Zu Steigern.Gebietsschema und zu Steigern.Regex verwenden Sie es, wenn es um Unicode. Siehe mein Kommentar auf Dory Sidon, die Antwort auf die Frage, warum ich empfehle, mit Intensivstation direkt, anstatt Wrapper (wie Boost).
Erstellen Sie einen Konverter für eine gegebene Codierung...
...und verwenden Sie dann die UnicodeString Klasse als appripriate.
Die Größe der
wchar_t
wird durch die Implementierung festgelegt. AFAICR, Windows ist 2 byte (UCS-2 /UTF-16, je nach Windows-version), Linux 4 byte (UTF-32). In jedem Fall, da der standard nicht definieren Unicode-Semantik fürwchar_t
ist es nicht tragbar Rätselraten. Raten Sie nicht, die ICU verwenden.Nicht in Ihre UTF-8-Codierung, aber Sie nicht verwenden, das intern sowieso. UTF-8 ist gut für die Außendarstellung, aber intern UTF-16 oder UTF-32 sind die bessere Wahl. Die oben genannten Funktionen existieren für die Unicode-Codepunkte (D. H., UChar32); ref. uchar.h.
Überprüfen BreakIterator.
Falls ich noch nicht sagte es bereits, tun die ICU verwenden, und sparen Sie sich Tonnen von ärger. Auch wenn es scheinen mag ein bisschen Schwergewicht auf den ersten Blick, es ist die beste Umsetzung gibt es ist extrem portabel (Nutzung auf Windows -, Linux-und AIX-selbst), und Sie wird verwenden Sie es wieder und wieder und wieder in Projekte zu kommen, so dass die investierte Zeit in das lernen der API ist nicht verschwendet.
Nicht sicher, ob dies wird Euch alles geben, was du suchst, aber möglicherweise hilft es ein wenig.
Haben Sie versucht, Blick auf:
1) Anheben.Locale-Bibliothek ?
Boost.Gebietsschema veröffentlicht wurde, in den Boost 1.48(November 15th, 2011) machen es einfacher, die Konvertierung von und nach UTF8/16
Hier sind einige praktische Beispiele aus den docs:
2) Oder bei
Umbauten sind Teil von C++11?
Dies ist einfach, es ist ein Projekt mit dem Namen tinyutf8 , das ist ein drop-in-Ersatz für
std::string
/std::wstring
.Dann kann der Benutzer aus operieren codepoints, während Ihre Darstellung ist immer kodiert
char
s.Möchten Sie vielleicht einen Blick auf
std::codecvt_utf8
und simlilar Vorlagen von<codecvt>
(C++11).UTF-8 ist eine Kodierung, die durch die Verwendung mehrerer bytes für nicht-ASCII-Zeichen (7 bit-code) unter Verwendung der 8-bit. Als solche werden Sie nicht finden
'\'
,'/'
innerhalb eines multi-byte-Sequenz. Undisdigit
funktioniert (wenn auch nicht Arabisch und andere stellen).Es ist eine Obermenge von ASCII und kann alle Unicode-Zeichen, also auf jeden Fall zu verwenden mit char und string.
Untersuchen Sie den HTTP-Headern (groß-und Kleinschreibung); Sie sind in ISO-8859-1, und vor eine leere Zeile, und dann die HTML-Inhalte.
Falls nicht vorhanden, auch dort könnte
ISO-8859-1 Latin-1, und Sie könnte besser tun, um zu konvertieren von Windows-1252, Windows Latin-1-Erweiterung mit 0x80 - 0xBF für einige Sonderzeichen wie Komma, Anführungszeichen und so.
Sogar Browser auf MacOS verstehen, diese aber ISO-8859-1 angegeben wurde.
Conversion-Bibliotheken: bereits erwähnt von @syam.
Konvertierung
Lassen Sie uns nicht überlegen, UTF-16. Liest man die überschriften und beginnen, bis eine meta-Anweisung für die als charset (single-byte-Zeichen.
Die Umwandlung von single-byte-Codierung auf UTF-8 passieren kann, ist, über eine Tabelle. Zum Beispiel erzeugt mit Java: eine
const char* table[]
indiziert durch die char.