2010-02-24 7 views
16

Supponiamo di avere una stringa arbitraria, s.Unicode - in genere funziona con C++

s ha la proprietà di essere da qualsiasi parte nel mondo. Persone provenienti da Stati Uniti, Giappone, Corea, Russia, Cina e Grecia scrivono tutte in s di volta in volta. Fortunatamente non abbiamo i viaggiatori del tempo che utilizzano la Linea A, tuttavia.

Per la amore di discussione, cerchiamo di presumere che vogliamo fare operazioni sulle stringhe come ad esempio:

  • inverso
  • lunghezza
  • capitalizzare
  • minuscolo indice
  • in

e, solo perché questo è per il bene della discussione, cerchiamo di presumere vogliamo scrivere queste routine noi stessi (invece di afferrare una biblioteca), e non abbiamo alcun software legacy da mantenere.

Esistono 3 standard per Unicode: utf-8, utf-16 e utf-32, ciascuno con pro e contro. Ma diciamo che sono un po 'stupido, e voglio che un solo Unicode li domini tutti (perché rotolare una libreria ad adattamento dinamico per 3 diversi tipi di codifiche delle stringhe che nascondono la differenza rispetto all'API suona molto).

  • Quale codifica è più generale?
  • Quale codifica è supportata da wchar_t?
  • Quale codifica è supportata dall'STL?
  • Queste codifiche sono tutte (o non tutte) terminate da null?

-

Il punto della questione è quello di educare me stesso e gli altri in informazioni utili ed utilizzabili per Unicode: la lettura delle RFC va bene, ma c'è una 'pila' di informazioni relative ai compilatori, linguaggi e sistemi operativi che le RFC non coprono, ma è fondamentale sapere per utilizzare effettivamente Unicode in una vera app.

+0

Non esattamente un dupe, ma anche leggere http://stackoverflow.com/questions/114611/questo-è-il-best-unicode-library-for-c –

+0

@Martin: Non sono molto interessato - a questo tempo - qual è la migliore libreria. Sono più interessato a aggiornarmi con le informazioni su Unicode in generale e su come scrivere un reverse - o forse una routine più oscura - in Unicode e non farlo esplodere, per esempio, in Turchia. :-) –

+0

sì, ecco perché non ho chiuso come dupe, ma qualcuno che trova questa domanda potrebbe essere interessato solo usando una libreria. Se questo thread ottiene buone risposte, lo incrocerò come riferimento nell'altro thread. –

risposta

9
  1. Quale codifica è più generale
    Probabilmente UTF-32, anche se tutti e tre i formati possono memorizzare qualsiasi carattere. UTF-32 ha la proprietà che ogni carattere può essere codificato in un singolo punto di codice.

  2. quale codifica è supportato da wchar_t
    Nessuno. Questa è l'implementazione definita. Sulla maggior parte delle piattaforme Windows è UTF-16, sulla maggior parte delle piattaforme Unix è UTF-32.

  3. quale codifica supportato dal STL
    Nessuno davvero.L'STL può store qualsiasi tipo di carattere desiderato. Basta usare il modello std::basic_string<t> con un tipo abbastanza grande da contenere il punto di codice. La maggior parte delle operazioni (ad esempio std::reverse) non conoscono comunque alcun tipo di codifica Unicode.

  4. Queste codifiche sono tutte (o non tutte) terminate da null?
    No. Il valore Null è un valore valido in ognuna di queste codifiche. Tecnicamente, NULL è un personaggio legale anche in semplice ASCII. La terminazione NULL è una cosa di tipo C, non una cosa di codifica.

Scegliere come fare ha molto a che fare con la piattaforma. Se sei su Windows, usa le stringhe UTF-16 e wchar_t, perché è quello che l'API di Windows usa per supportare l'unicode. Non sono del tutto sicuro di quale sia la scelta migliore per le piattaforme UNIX, ma so che la maggior parte di esse utilizza UTF-8.

+2

Anche con UTF-32 non è possibile memorizzare ogni carattere come singolo punto di codice. Questa codifica garantisce semplicemente il mapping 1: 1 tra unità di codice e punti di codice (per i dettagli sulla terminologia, controlla unicode.org) –

+0

Err ... in realtà, è possibile. Unicode richiede 21 bit per l'intero set di caratteri. UTF-32 fornisce 32 bit in un singolo punto di codice. I caratteri non dovrebbero mai essere divisi su UTF-32. Stai pensando a UTF-16. –

+3

Stai parlando di punti di codice qui, non di personaggi. Alcuni (in effetti molti) caratteri devono essere descritti con più punti di codice, indipendentemente dalla codifica.Dai un'occhiata a questo link, ad esempio: http://www.unicode.org/faq/char_combmark.html –

5

Dai un'occhiata alla libreria open source ICU, in particolare allo Docs & Papers section. È una vasta libreria che si occupa di ogni sorta di stranezze unicode.

+1

L'OP ha chiesto esplicitamente una risposta non di libreria. –

+2

Ecco perché ho fatto riferimento alla sezione Documenti e documenti. Se l'OP vuole seriamente imparare a conoscere la gestione unicode, non dovrebbe astenersi dal guardare le soluzioni esistenti. L'ICU fornisce non solo il codice sorgente di livello produttivo, ma anche i documenti di progettazione. –

+0

Ah - Capisco. +1 poi. –

1

Definire "vero e proprio app" :)

Scherzi a parte, la decisione dipende davvero molto dal tipo di software che si sta sviluppando. Se la tua piattaforma di destinazione è l'API Win32 (con o senza wrapper come MFC, WTL, ecc.) Probabilmente vorresti usare i tipi wstring con il testo codificato come UTF-16. Questo è semplicemente perché tutte le API Win32 utilizzano internamente quella codifica comunque.

D'altra parte, se l'output è qualcosa come XML/HTML e/o deve essere distribuito su Internet, UTF-8 è praticamente lo standard - di solito viene trasmesso bene tramite protocolli che fanno supposizioni sui personaggi che hanno 8 bit.

Per quanto riguarda UTF-32, non riesco a pensare a un singolo motivo per usarlo, a meno che non sia necessario il mapping 1: 1 tra unità di codice e punti di codice (che ancora non significa mappatura 1: 1 tra unità di codice e personaggi!).

Per ulteriori informazioni, assicurarsi di guardare Unicode.org. This FAQ potrebbe essere un buon punto di partenza.

+0

Una cosa su cui non sono chiaro: una qualsiasi delle codifiche UTF può rappresentare tutti glifi utilizzati in tutti gli scritti in lingua di oggi? Cioè, se seleziono UTF-8 o UTF-16, dovrei chiudermi da determinati mercati? –

+2

@Paul. UTF-8, UTF-16 e UTF-32 descrivono esattamente gli stessi dati (punti di codice Unicode) solo in modo diverso codificato e, rigorosamente tecnicamente parlando, puoi usarne uno per memorizzare qualsiasi testo coperto dallo standard Unicode (tutte le lingue viventi sono coperte) . Detto questo, è necessario tenere conto di problemi non tecnici: ad esempio, la Cina richiede l'utilizzo di GB18030 anche se i moduli di codifica Unicode standard coprono anche le lettere cinesi. –

2

In risposta al proiettile finale, UTF-8 è garantito per non avere NULL byte nella sua codifica di qualsiasi carattere (tranne NULL stesso, ovviamente). Di conseguenza, molte funzioni che funzionano con stringhe con terminazione NULL funzionano anche con stringhe con codifica UTF-8.