Sono piuttosto inorridito che le persone suggeriscano effettivamente di usare UTF-8 in una std::string
e sono OK con UTF-16% distd::wstring
.
Lo fai davvero? Pensi che sia OK?
La mia convenzione è:
std::string
= UTF-8. Per uso generale. Utf16String
= UTF-16. Utilizzato principalmente per le chiamate di sistema di Windows.
std::wstring
in Windows std::basic_string<uint16_t>
in Linux Utf32String
= UTF-32.
std::basic_string<uint32_t>
in Windows std::wstring
in Linux. std::vector<unsigned char>
= dati binari non stringa Devi solo abituarti a pensare alle stringhe come a una serie di punti di codice invece di una serie di caratteri. Con questa vista, tutti i metodi di stringa funzionano correttamente eccetto per find_first_of
/ find_last_of
/ find_first_not_of
/ find_last_not_of
.
Beh, diciamo che molti programmatori ancora non sanno che UTF-16 è una codifica multibyte (pensano ancora che il char wide 16 bit sia sufficiente per rappresentare tutti i caratteri Unicode, ma in realtà sono bloccati con il vecchio UCS-2 ).
Tuttavia, non c'è un vero svantaggio nell'usare un wstring
per archiviare il testo di UCS-16, ma dovresti sapere che il suo length
non rappresenta necessariamente il numero di simboli di testo che verranno stampati.
Anche se memorizzi UCS-4 in una stringa, ancora non può garantire una relazione 1: 1 tra un elemento memorizzato nella stringa e (almeno un utente tipico lo vedrà come) un singolo carattere quando viene visualizzato o stampato (se la stringa contiene sequenze di caratteri combinate).
Ora, è vero che con UCS-4 un singolo elemento nella stringa viene mappato su un singolo punto di codice anche se non è necessariamente un singolo carattere. È possibile evitare il mapping di più elementi di stringa su un singolo punto di codice. Non è possibile (del tutto) evitare la mappatura di più punti di codice in un singolo "carattere" (e la canonicalizzazione anche per avvicinarsi non è banale). Il problema è che il "punto di codice" è un costrutto quasi interamente artificiale. Essere entusiasti di / condannarne uno mentre si ignora l'altro no (IMO) ha molto senso.
Leggi altre domande sui tag c++