Frage

Ich bin mit TinyXML in XML-Dateien zu analysieren / bauen. Nun, nach der Dokumentation dieser Bibliothek unterstützt Mehrbyte-Zeichensätze durch UTF-8. So weit so gut, denke ich. Aber die einzige API, die die Bibliothek bietet (zum Ermitteln / Setzen von Elementnamen, Attributnamen und Werte, ... alles, wo ein String verwendet wird) ist durch std::string oder const char*. Das hat ich mein eigenes Verständnis von Mehrbyte-Zeichensatz Unterstützung zu zweifeln. Wie kann eine Zeichenfolge, die unterstützt nur 8-Bit-Zeichen ein 16-Bit-Zeichen enthalten (es sei denn es eine Codepage verwendet, die die ‚unterstützt Unicode‘ Anspruch negieren würde)? Ich verstehe, dass Sie theoretisch einen 16-Bit-Codepunkt nehmen und es mehr als 2 Zeichen in einem std::string gespalten, aber das würde die std::string auf eine ‚Unicode‘ String nicht verwandeln, es wäre es für die meisten Zwecke ungültig machen und würde vielleicht aus Versehen arbeiten, wenn in eine Datei geschrieben und gelesen von einem anderen Programm.

So kann jemand mir erklären, wie eine Bibliothek kann ein '8-Bit-Interface' (std::string oder const char*) bietet und unterstützt Strings 'Unicode' noch?

(ich wahrscheinlich einige Unicode-Terminologie hier gemischt, traurig über die Verwirrung aus, dass kommt).

War es hilfreich?

Lösung

Als erstes utf-8 ist in const char * Strings gespeichert, wie @quinmars sagte. Und es ist nicht nur ein Superset von 7-Bit-ASCII (Codepunkte <= 127 immer in einem einzigen Byte als selbst codieren), ist es weiterhin vorsichtig, dass Bytes mit diesen Werten wird nie als Teil der Codierung der Multibyte Werte für Codepunkte verwendet So> = 128, wenn Sie einen Byte == 44 zu sehen, es ist ein '<' Zeichen usw. Alle der metachars in XML sind in 7-bit ASCII. So kann man einfach die XML analysiert, Strings zu brechen, wo der metachars zu sagen, die Fragmente kleben (möglicherweise einschließlich Nicht-ASCII-Zeichen) in eine char * oder std :: string, und die zurückgegebenen Fragmente bleiben gültig UTF-8-Strings, obwohl die Parser haben speziell nicht, UTF-8.

Weitere (nicht spezifisch für XML, sondern klug), noch komplexere Dinge genrally funktionieren (tm). Zum Beispiel, wenn Sie UTF-8 lexikografisch von Bytes sortieren, erhalten Sie die gleiche Antwort wie es lexikografisch von Codepunkten, trotz der Änderung der Anzahl des verwendeten Bytes sortieren, weil das Präfix-Bytes, die länger (und damit höherwertiger) Code Einführung Punkte sind numerisch größer als die für kleinere Werte).

Andere Tipps

UTF-8 ist kompatibel zu 7-Bit-ASCII-Code. Wenn der Wert eines Bytes größer als 127 ist, bedeutet dies ein Multibyte-Zeichen beginnt. Je nach dem Wert des ersten Bytes können Sie das Zeichen sehen, wie viele Bytes nehmen, kann man erkennen, 2-4 Bytes einschließlich des ersten Bytes sein (technische auch 5 oder 6 sind möglich, aber sie sind nicht gültig utf-8). Hier ist eine gute Ressource über UTF-8: UTF-8 und Unicode FAQ , auch die Wiki-Seite für UTF-8 ist sehr informativ. Da UTF-8 Zeichen basiert und 0-terminierte, können Sie die Standard-String-Funktionen für die meisten Dinge verwenden. Das einzig Wichtige ist, dass die Anzahl der Zeichen aus der Byte-Zählung unterscheiden kann. Funktionen wie strlen () gibt die Byte-Anzahl, aber nicht unbedingt die Anzahl der Zeichen.

Durch die Verwendung von zwischen 1 und 4 Zeichen eines Unicode-Codepunkt zu codieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top