2009-09-29 8 views
8

Jaki jest najlepszy typ, w C++, do przechowywania ciągu znaków UTF-8? Chciałbym, jeśli to możliwe, uniknąć toczyć własną klasę.Najlepszy typ dla danych UTF-8?

Moja oryginalna myśl to std::string - jednak jako typ bazowy używany jest char. char może być niepodpisany lub podpisany - może być różny. W moim systemie jest podpisany. Jednak jednostki kodowe UTF-8 są niepodpisane oktety. Wydaje się to wskazywać, że jest to niewłaściwy typ.

To prowadzi nas do std::basic_string<unsigned char> - która wydaje się pasować do rachunku: niepodpisane, 8-bitowe (lub większe) znaki.

Jednak większość rzeczy wydaje się używać char. glib na przykład używa char. Używanie C++ ostreamchar.

Myśli?

Odpowiedz

9

Po prostu użyłbym std :: string, ponieważ jest zgodne z ideą obróbki danych UTF-8 tak samo, jak z zakończonymi znakami null ciągami ASCII, chyba że faktycznie potrzebujesz ich unicode-ności.

Podoba mi się również Glib GTBmm :: ustring, ale działa to tylko wtedy, gdy piszesz aplikację GTKmm (lub przynajmniej Glibmm).

+4

Jedynym prawdziwym problemem z używaniem std :: string jest to, że niektórzy operatorzy, którzy mają pracować nad znakami, mogą w rzeczywistości zajmować się znakami częściowymi, ponieważ UTF-8 jest kodowaniem wielobajtowym. Na przykład użycie operatora [] zostanie przerwane, aby uzyskać "znaki" oprócz długości łańcucha, który nie jest bezpośrednio dostępny. (Rozmiar jest dostępny, ale nie długość). –

+0

Wystarczy pomyśleć o łańcuchu będącym tablicą jednostek kodu zamiast tablicy znaków. Wtedy jedynymi funkcjami składowymi 'string', które nie działają są te, jak' find_one_of', które przyjmują zestaw znaków jako argument. – dan04

+2

@Evan: Definicja "znaków" i "długości" jest tak złożona w Unicode (z powodu łączenia i ligatur i innych rzeczy), że nigdy nie będą one bezpośrednio dostępne. Lepiej nie udawać, że są. –

7

Zawsze używałam std :: string, ja - w jakiś sposób pytanie "podpisane" a "niepodpisane" w zasadzie nigdy nie pojawia się jako problematyczne w takim kontekście (kodery i dekodery do/z UTF- 8 rzeczy rzadko piszesz, przecież w kontekście aplikacji używasz std :: string jako "czarnej skrzynki"!

4

Kodowanie UTF-8 o zmiennej długości o zmiennej długości. std::basic_string obsługuje tylko kodowanie znaków o stałej długości o stałej długości. Jeśli potrzebujesz obsługiwać o zmiennej długości kodowania, możesz spróbować ICU4C library.

ICU jest dojrzałym, szeroko stosowanym zestawem bibliotek C/C++ i Java zapewniającym obsługę programów Unicode i Globalizacja. ICU jest szeroko przenośna i daje aplikacjom takie same wyniki na wszystkich platformach oraz między oprogramowaniem C/C++ i Java.

Jeśli potrzebujesz tylko przechowywać UTF-8 ciąg polecam użyć std::vector<char>. Oznacza to, że nie można wykonywać rzeczywistych operacji na łańcuchach (które mogą być nieprawidłowe) na przechowywanych danych.

Powiązane problemy