Domanda

Sto ancora cercando di decidere se il mio progetto (home) debba usare UTF-8 stringhe (implementate in termini di std :: string con funzioni specifiche aggiuntive UTF-8 quando necessario) o alcune stringhe a 16 bit (implementate come std :: wstring). Il progetto è un linguaggio di programmazione e un ambiente (come VB, è una combinazione di entrambi).

Vi sono alcuni desideri / vincoli:

  • Sarebbe bello se potesse funzionare su hardware limitato, come computer con memoria limitata.
  • Voglio che il codice sia eseguito su Windows, Mac e (se le risorse lo consentono) Linux.
  • Userò wxWidgets come livello della mia GUI, ma voglio il codice che interagisce con quello toolkit confinato in un angolo del codebase (avrò eseguibili non GUI).
  • Vorrei evitare di lavorare con due diversi tipi di stringhe quando lavoro con testo visibile all'utente e con i dati dell'applicazione.

Attualmente sto lavorando con std :: string, con l'intento di usare le funzioni di manipolazione UTF-8 solo quando necessario. Richiede meno memoria e sembra essere la direzione in cui stanno andando comunque molte applicazioni.

Se si consiglia una codifica a 16 bit, quale: UTF-16 ? UCS-2 ? Un altro?

È stato utile?

Soluzione

Consiglierei UTF-16 per qualsiasi tipo di manipolazione dei dati e UI. L'API di Mac OS X e Win32 utilizza UTF-16, lo stesso per wxWidgets, Qt, ICU, Xerces e altri. UTF-8 potrebbe essere migliore per lo scambio e l'archiviazione dei dati. Vedi http://unicode.org/notes/tn12/ .

Ma qualunque cosa tu scelga, consiglierei sicuramente contro std :: string con UTF-8 " solo quando necessario " ;.

Procedi fino in fondo con UTF-16 o UTF-8, ma non mescolare e abbinare, ciò richiede problemi.

Altri suggerimenti

UTF-16 è ancora una codifica di caratteri a lunghezza variabile (ci sono più di 2 ^ 16 codici unicode), quindi non è possibile eseguire operazioni di indicizzazione di stringhe O (1). Se stai facendo un sacco di cose del genere, non stai salvando nulla in velocità su UTF-8. D'altra parte, se il tuo testo include molti punti di codice nell'intervallo 256-65535, UTF-16 può essere un miglioramento sostanziale delle dimensioni. UCS-2 è una variazione su UTF-16 che è di lunghezza fissa, al costo di proibire punti di codice maggiori di 2 ^ 16.

Senza saperne di più sulle tue esigenze, sceglierei personalmente UTF-8. È il più facile da affrontare per tutti i motivi che altri hanno già elencato.

Non ho mai trovato alcun motivo per usare nient'altro che UTF-8 per essere onesti.

Se decidi di utilizzare la codifica UTF-8, consulta questa libreria: http://utfcpp.sourceforge.net /

Potrebbe semplificarti la vita.

In realtà ho scritto un'applicazione ampiamente usata (5 milioni + utenti), quindi ogni kilobyte usato si somma, letteralmente. Nonostante ciò, mi sono appena bloccato su wxString. L'ho configurato per derivare da std :: wstring, quindi posso passarle a funzioni aspettandomi una const & Amp ;.

Si noti che std :: wstring è Unicode nativo sul Mac (non è necessario UTF-16 per caratteri sopra U + 10000) e quindi utilizza 4 byte / wchar_t. Il grande vantaggio di questo è che i ++ ti offre il personaggio successivo, sempre. Su Win32 questo è vero solo nel 99,9% dei casi. Come collega programmatore, capirai quanto poco è il 99,9%.

Ma se non sei convinto, scrivi la funzione in maiuscolo una stringa std :: string [UTF-8] e una stringa std :: wstring. Queste 2 funzioni ti diranno in che direzione è la follia.

Il tuo formato su disco è un'altra questione. Per la portabilità, dovrebbe essere UTF-8. Non c'è alcun problema di endianness in UTF-8, né una discussione sull'ampiezza (2/4). Questo potrebbe essere il motivo per cui molti programmi sembrano usare UTF-8.

Su una nota leggermente non correlata, leggi le comparazioni e la normalizzazione delle stringhe Unicode. Oppure finirai con lo stesso bug di .NET, dove puoi avere due variabili f & # 246; & # 246; e <<>> # 246; & # 246; differendo solo nella normalizzazione (invisibile).

MicroATX è praticamente un formato di scheda madre per PC standard, la maggior parte in grado di supportare 4-8 GB di RAM. Se stai parlando di picoATX forse hai un limite di 1-2 GB di RAM. Anche allora è abbastanza per un ambiente di sviluppo. Continuerei a usare UTF-8 per i motivi sopra menzionati, ma la memoria non dovrebbe essere la tua preoccupazione.

Da quello che ho letto, è meglio usare una codifica a 16 bit internamente a meno che tu non abbia poca memoria. Si adatta a quasi tutte le lingue viventi in un solo personaggio

Guarderei anche ICU . Se non utilizzerai determinate funzionalità STL delle stringhe, l'utilizzo dei tipi di stringa ICU potrebbe essere migliore per te.

Hai pensato di utilizzare wxStrings? Se ricordo bene, possono fare utf-8 & Lt; - & Gt; Conversioni Unicode e renderà un po 'più semplice quando devi passare le stringhe da e verso l'interfaccia utente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top