2012-10-12 14 views
5

lo fa ha alcun senso per memorizzare UTF-16 codificato testo utilizzando wchar_t* su Linux? Il problema ovvio è che wchar_t è quattro byte su Linux e UTF-16 richiede solitamente due (o talvolta due gruppi di due) byte per carattere.wchar_t per UTF-16 su Linux?

Sto cercando di utilizzare una libreria di terze parti che fa esattamente questo e sembra molto confuso. Sembra che le cose siano incasinate perché su Windows wchar_t ci sono due byte, ma voglio solo ricontrollare dato che è una libreria commerciale piuttosto costosa e forse non capisco qualcosa.

+1

Si ** può ** memorizzare un valore lungo di 2 byte in una variabile lunga 4 byte ... –

+0

Penso che sia necessario leggere e capire [questo] (http://www.joelonsoftware.com/articles /Unicode.html) –

+0

C'è un motivo per non usare un 'uint16_t' per rappresentare un'unità di codice UTF-16? –

risposta

6

Mentre è possibile memorizzare UTF-16 in wchar_t, tali wchar_t valori (o array di essi utilizzati come stringhe) non sono adatti per l'uso con qualsiasi funzioni standard che prendono wchar_t o puntatori a wchar_t stringhe. In quanto tale, per rispondere alla tua domanda iniziale di "Ha senso ...?", Risponderei con un no definitivo. Si potrebbe utilizzare uint16_t per questo scopo, naturalmente, o C11 char16_t se è disponibile, anche se non vedo alcuna ragione per cui quest'ultimo sarebbe stato preferibile a meno che non si sta anche andando a utilizzare le funzioni di C11 per l'elaborazione (e don' t sembra essere ancora implementato).

3

http://userguide.icu-project.org/strings dice

Lo standard Unicode definisce una codifica predefinita basato su unità di codice a 16 bit. Questo è supportato in ICU dalla definizione di UChar per essere un tipo intero a 16 bit senza segno. Questo è il tipo di base per gli array di caratteri per le stringhe in ICU.

Quindi se si utilizza ICU, è possibile utilizzare UChar*. Altrimenti, uint16_t renderà la transizione più semplice se si desidera interagire con UChar.

1

Bene, la soluzione migliore è probabilmente quello di utilizzare char16_t per UTF-16, dato che è il tipo di caratteri standard a 16 bit. Questo è stato supportato da gcc 4.4, quindi dovrebbe essere presente sulla maggior parte dei sistemi Linux che vedrai.

0

No, ha senso decodificare l'UTF-16 e memorizzarlo in un array di wchar_t. Non tutti i punti di codice Unicode hanno esattamente una parola di 16 bit in UTF-16, ma si adattano tutti in un wchar_t.

In ogni caso, UTF-16 è un compromesso peggio di ogni altra cosa, e non dovrebbe mai essere utilizzato. Utilizza UTF-8 (che è più efficiente nella maggior parte dei casi e più comunemente usato) oppure usa wchar_t [].

+3

L'OP dice "su Windows wchar_t è due byte" quindi non può contenere un punto di codice supplementare che suggerisce che "tutti si adattano in un wchar_t" non è il caso. Sono d'accordo che UTF-16 è una scelta sbagliata per la rappresentazione interna - ha gli svantaggi di entrambi UTF-8 (più complicata iterazione) e UTF-32 (size-bloat), ma è lo standard per cose come ICU così uno può fare in modo che una libreria ne intercetta il caso. –