Pensa che memorizzare una codifica di lunghezza variabile in std :: string o std :: wstring sia OK e lo fai?

4

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?

    
posta Let_Me_Be 29.10.2010 - 15:23
fonte

3 risposte

8

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 .

    
risposta data 28.01.2011 - 06:20
fonte
2

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.

    
risposta data 29.10.2010 - 18:42
fonte
2

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.

    
risposta data 28.01.2011 - 06:59
fonte

Leggi altre domande sui tag