Używam TinyXML do parsowania/kompilowania plików XML. Teraz, zgodnie z the documentation biblioteka ta obsługuje wielobajtowe zestawy znaków za pośrednictwem UTF-8. Jak dotąd tak dobrze, myślę. Jednak jedynym interfejsem API udostępnianym przez bibliotekę (do pobierania/ustawiania nazw elementów, nazw i wartości atrybutów, ... wszędzie tam, gdzie używany jest ciąg znaków) jest std::string
lub const char*
. To mnie wątpi w moje rozumienie obsługi wielobajtowego zestawu znaków. W jaki sposób ciąg znaków, który obsługuje tylko znaki 8-bitowe, zawiera znak 16-bitowy (chyba że używa strony kodowej, która neguje żądanie "obsługuje Unicode")? Rozumiem, że teoretycznie można wziąć 16-bitowy punkt kodowy i podzielić go na 2 znaki w postaci std::string
, ale nie przekształciłoby to std::string
w ciąg znaków "Unicode", spowodowałoby, że byłby on nieważny dla większości celów i może przypadkowo działa, gdy jest zapisany do pliku i wczytany przez inny program.Jak działa obsługa formatu TinyXML w UTF-8?
A może ktoś mi wytłumaczy, w jaki sposób biblioteka może zaoferować "8-bitowy interfejs" (std::string
lub const char*
) i nadal obsługuje łańcuchy "Unicode"?
(Prawdopodobnie pomieszałem tu trochę terminologii Unicode, przepraszam za wszelkie zamieszanie z tego powodu).
OK, dzięki temu staje się jaśniejsze, ale mimo to - używanie std :: string do reprezentowania w ten sposób danych UTF-8 nie jest tak semantycznie błędne? Nigdy nie będziesz mógł polegać na zawartości tego łańcucha - nie będzie nawet sposobu, aby wiedzieć, jak długo to trwa! (w długości znaków). – Roel
Nawet w przypadku wersji const char * nadal będziesz musiał użyć innej biblioteki, aby pracować niezawodnie z ciągiem znaków. – Roel
Więcej niezdefiniowane niż źle. Metody std :: string (concatenation, iterator slicing, find_ *, etc) nadal działają. length() jest mimo wszystko zdefiniowane jako == size(). Jest nowy warunek wstępny, który kompensuje się na granicy znaku. Jeśli std :: string złożyłaby jakąś obietnicę dotyczącą kodowania, byłoby to błędne, ale tak nie jest. – puetzk