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++ ostream
char
.
Myśli?
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ść). –
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
@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ą. –