Se ho capito bene, è possibile utilizzare sia stringa che stringa per memorizzare testo UTF-8.std :: string e Unicode codificato UTF-8
Con char, caratteri ASCII prendono un singolo byte, alcuni caratteri cinesi prendono 3 o 4, ecc Il che significa che
str[3]
non necessariamente puntare al 4 ° carattere.Con
wchar_t
stessa cosa, ma la quantità minima di byte utilizzati per personaggi è sempre 2 (invece di 1 perchar
), e un carattere largo 3 o 4 byte avrà 2wchar_t
.
Giusto?
Quindi, cosa succede se voglio utilizzare string::find_first_of()
o string::compare()
, ecc con una stringa così stranamente codificata? Funzionerà ? La classe string gestisce il fatto che i caratteri hanno una dimensione variabile? O dovrei usarli solo come semplici array di byte senza funzionalità, nel qual caso preferirei utilizzare un buffer wchar_t[]
.
Se std::string
non gestisce che, seconda domanda: esistono librerie forniscono classi stringa che possa gestire che codifica UTF-8 in modo che str[3]
effettivamente punti al 3 ° carattere (che sarebbe un array di byte da lunghezza da 1 a 4)?
Si noti che anche se 'str [3]' era il quarto punto di codice, non è necessariamente il quarto carattere percepito dall'utente. – delnan
@delnan _Ok scusate (ho appena scelto un articolo di esempio su wchar_t, Windows e UTF-16). Dato che era troppo tardi per modificare ho cancellato il commento, e qui è tornata la parte senza il link "controverso": _ Penso che la dimensione di 'wchar_t' sia definita dall'implementazione, quindi _non_ sempre 2 byte. Inoltre (IIRC) Windows lo usa per memorizzare qualcosa come UTF-16, non UTF-8. Vedi http://en.wikipedia.org/wiki/Wide_character –