Ich verwende TinyXML zum Parsen/Erstellen von XML-Dateien. Nach the documentation unterstützt diese Bibliothek Multibyte-Zeichensätze über UTF-8. So weit, so gut, denke ich. Aber die einzige API, die die Bibliothek bereitstellt (zum Abrufen/Festlegen von Elementnamen, Attributnamen und -werten, ... alles, wo eine Zeichenfolge verwendet wird), ist über std::string
oder const char*
. Das hat Zweifel an meinem Verständnis von Multibyte-Zeichensatz-Unterstützung. Wie kann eine Zeichenfolge, die nur 8-Bit-Zeichen unterstützt, ein 16-Bit-Zeichen enthalten (es sei denn, sie verwendet eine Codepage, die den Anspruch "Unicode unterstützt" negiert)? Ich verstehe, dass Sie theoretisch einen 16-Bit Codepunkt nehmen und ihn über 2 Zeichen in einem std::string
teilen könnten, aber das würde den std::string
nicht in einen 'Unicode'-String umwandeln, würde es für die meisten Zwecke ungültig machen und würde vielleicht versehentlich arbeiten, wenn sie in eine Datei geschrieben und von einem anderen Programm eingelesen werden.Wie funktioniert die UTF-8-Unterstützung von TinyXML?
Also, kann mir jemand erklären, wie eine Bibliothek eine '8-Bit-Schnittstelle' (std::string
oder const char*
) anbieten kann und trotzdem Unicode-Strings unterstützt?
(Ich habe hier wahrscheinlich ein wenig Unicode-Terminologie durcheinandergebracht; tut mir leid wegen der Verwirrung, die daraus entsteht).
Ok danke, es wird klarer, aber dann - mit std :: string, um UTF-8 Daten auf diese Weise darzustellen, ist das nicht semantisch falsch? Sie können sich nie auf den Inhalt dieser Zeichenfolge verlassen - es wird nicht einmal möglich sein zu wissen, wie lange es ist! (in Zeichenlänge). – Roel
Und selbst für die Version const char * müssen Sie immer noch eine andere Bibliothek verwenden, um zuverlässig mit der Zeichenfolge zu arbeiten. – Roel
Mehr undefiniert als falsch. Die Methoden von std :: string (Verkettung, Iterator-Slicing, find_ *, usw.) funktionieren immer noch. length() wird sowieso nur als == size() definiert. Es gibt eine neue Voraussetzung dafür, dass Offsets an einer Char-Grenze liegen. Wenn std :: string irgendwelche Versprechungen bezüglich der Kodierung machen würde, wäre es falsch, tut es aber nicht. – puetzk