Elaborazione Unicode in C ++


Risposte:


81
  • Usa ICU per gestire i tuoi dati (o una libreria simile)
  • Nel tuo archivio dati, assicurati che tutto sia archiviato nella stessa codifica
  • Assicurati di utilizzare sempre la tua libreria Unicode per compiti banali come la lunghezza della stringa, lo stato delle maiuscole, ecc. Non usare mai i builtin della libreria standard come a is_alphameno che non sia la definizione che desideri.
  • Non posso dirlo abbastanza: non iterare mai sugli indici di a stringse ti interessa la correttezza, usa sempre la tua libreria Unicode per questo.

A meno che non si tratti di stringdati binari.
Demi

10

Se non ti interessa la retrocompatibilità con i precedenti standard C ++, l'attuale standard C ++ 11 ha il supporto Unicode integrato: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

Quindi la vera best practice per l'elaborazione Unicode in C ++ sarebbe quella di utilizzare le funzionalità integrate per esso. Tuttavia, questa non è sempre una possibilità con le basi di codice più vecchie, poiché lo standard è così nuovo al momento.

EDIT: Per chiarire, C ++ 11 è a conoscenza di Unicode in quanto ora ha il supporto per i letterali Unicode e le stringhe Unicode. Tuttavia, la libreria standard ha solo un supporto limitato per l'elaborazione e la conversione Unicode. Per le tue esigenze attuali questo potrebbe essere sufficiente. Tuttavia, se è necessario eseguire una grande quantità di sollevamento di carichi pesanti in questo momento, potrebbe essere comunque necessario utilizzare qualcosa come ICU per un'elaborazione più approfondita. Ci sono alcune proposte attualmente in lavorazione per includere un supporto più robusto per la conversione del testo tra diverse codifiche. La mia ipotesi (e spero) è che questo farà parte del prossimo rapporto tecnico .


Il collegamento a una bozza di documento standard non è molto utile senza un riferimento a una particolare sezione che descrive il "supporto Unicode integrato" di cui stai discutendo.
Ben Collins

1
@BenCollins Sezione 2.14.5 "Valori letterali stringa" - discute i letterali stringa, inclusi i letterali stringa per le codifiche UTF-8, UTF-16 e UTF-32. Sezione 22.4.1.4 "Class template codecvt" - discute la classe codecvt utilizzata per la conversione tra codifiche di caratteri (inclusi UTF-8, UTF-16 e UTF-32). C'è di più sul supporto Unicode disseminato in tutto il documento, ma queste sembrano essere le sezioni più critiche sull'argomento.
eestrada

9

La nostra azienda (e altri) utilizzano la libreria Internation Components for Unicode (ICU) open source originariamente sviluppata da Taligent.

Gestisce stringhe, impostazioni locali, conversioni, data / ora, regole di confronto, trasformazioni, ecc. al.

Inizia con la guida utente ICU


5

Ecco una lista di controllo per la programmazione Windows:

  • Tutte le stringhe racchiuse in _T ("la mia stringa")
  • funzioni strlen () ecc. sostituite con _tcslen () ecc.
  • Usa LPTSTR e LPCTSTR invece di char * e const char *
  • Quando avvii nuovi progetti in Dev Studio, assicurati religiosamente che l'opzione Unicode sia selezionata nelle proprietà del progetto.
  • Per le stringhe C ++, usa std :: wstring invece di std :: string

11
Non utilizzare stringhe "T", caratteri e funzioni, a meno che non si intenda eseguire build sia Unicode che ANSI. Se intendi fare solo build Unicode, esegui solo normali caratteri wide: L "my wide string" wcslen (L "my string") ecc.
1800 INFORMAZIONI

D'accordo, usa solo le macro _T se vuoi un testo generico, cioè la capacità di codificare sia per Unicode che per Ascii / MBCS.

1
Nel caso in cui si desideri eseguire sia Unicode che ANSI per le stringhe C ++, utilizzare qualcosa come typedef std :: basic_string <TCHAR> tString;
Serge

Ah sì, faccio sempre #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif ma mi piace di più Serge.
Adam Pierce,

4
Onestamente, penso che UTF16 sia uno spreco, lasciare tutte le codifiche in UTF8 è più semplice e molto più compatibile con * nix.
chacham15

3

Guarda il confronto tra stringhe senza distinzione tra maiuscole e minuscole in C ++

Questa domanda contiene un collegamento alla documentazione Microsoft su Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Se guardi sul lato di navigazione a sinistra su MSDN accanto a quell'articolo, dovresti trovare molte informazioni relative alle funzioni Unicode. Fa parte di un capitolo sulla "Codifica dei caratteri" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Ha le seguenti sottosezioni:

  • Il modello della pagina codici
  • Set di caratteri a doppio byte in Windows
  • Unicode
  • Problemi di compatibilità in ambienti misti
  • Conversione dei dati Unicode
  • Migrazione di programmi basati su Windows in Unicode
  • Sommario

2

Anche se questa potrebbe non essere la migliore pratica per tutti, puoi scrivere le tue routine C ++ UNICODE se vuoi!

Ho appena finito di farlo in un fine settimana. Ho imparato molto, anche se non garantisco che sia privo di bug al 100%, ho fatto molti test e sembra funzionare correttamente.

Il mio codice è sotto la nuova licenza BSD e può essere trovato qui:

http://code.google.com/p/netwidecc/downloads/list

Si chiama WSUCONV e viene fornito con un programma main () di esempio che converte tra UTF-8, UTF-16 e ASCII standard. Se butti via il codice principale, hai una bella libreria per leggere / scrivere UNICODE.


1

Come è stato detto sopra, una libreria è la soluzione migliore quando si utilizza un sistema di grandi dimensioni. Tuttavia, alcune volte vuoi gestire le cose da solo (forse perché la libreria userebbe molte risorse come su un microcontrollore). In questo caso vuoi una semplice libreria da cui copiare le parti per le cose che ti servono effettivamente.

Il codice di esempio di Willow Schlanger sembra buono (vedi la sua risposta per maggiori dettagli).

Ho anche trovato un altro che ha un codice più piccolo, ma non ha il controllo completo degli errori e gestisce solo UTF-8 ma era più semplice da cui estrarre le parti.

Ecco un elenco delle librerie incorporate che sembrano decenti.

Librerie incorporate



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.