2012-10-12 88 views
5

¿Tiene sentido almacenar texto codificado en UTF-16 usando wchar_t* en Linux? El problema obvio es que wchar_t tiene cuatro bytes en Linux y UTF-16 toma generalmente dos (o a veces dos grupos de dos) bytes por carácter.wchar_t para UTF-16 en Linux?

Estoy tratando de usar una biblioteca de terceros que hace exactamente eso y parece muy confuso. Parece que las cosas están en mal estado porque en Windows wchar_t son dos bytes, pero solo quiero volver a comprobarlo ya que es una biblioteca comercial bastante cara y puede ser que simplemente no entiendo algo.

+1

** Puede ** almacenar un valor de 2 bytes de longitud en una variable de 4 bytes de largo ... –

+0

Creo que debe leer y comprender [esto] (http://www.joelonsoftware.com/articles /Unicode.html) –

+0

¿Hay alguna razón para no usar 'uint16_t' para representar una unidad de código UTF-16? –

Respuesta

6

Mientras que es posible almacenar UTF-16 en wchar_t, tales wchar_t valores (o matrices de ellos utilizados como cadenas) no son adecuados para su uso con cualquiera de las funciones estándar que tienen wchar_t o punteros a wchar_t cuerdas. Como tal, para responder a su pregunta inicial de "¿Tiene sentido ...?", Yo respondería con un no definitivo. Puede usar uint16_t para este propósito, por supuesto, o C11 char16_t si está disponible, aunque no veo ninguna razón por la cual este último sea preferible a menos que también vaya a usar las funciones C11 para procesarlo (y no lo hacen). parece que todavía está implementado).

3

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

El estándar Unicode define una codificación predeterminada basada en unidades de código de 16 bits. Esto es soportado en ICU por la definición de UChar para que sea un tipo entero de 16 bits sin signo. Este es el tipo de base para matrices de caracteres para cadenas en ICU.

Entonces, si usa la UCI, entonces puede usar UChar*. De lo contrario, uint16_t facilitará la transición en caso de que desee interoperar con UChar.

1

Bueno, la mejor solución es probablemente usar char16_t para UTF-16, ya que ese es el tipo de carácter estándar de 16 bits. Esto ha sido soportado desde gcc 4.4, por lo que debería estar presente en la mayoría de los sistemas Linux que verá.

0

No, tiene sentido decodificar el UTF-16 y almacenarlo en una matriz de wchar_t. No todos los puntos de código Unicode tienen exactamente una palabra de 16 bits en UTF-16, pero todos caben en un wchar_t.

En cualquier caso, UTF-16 es un compromiso peor que cualquier otra cosa, y nunca se debe utilizar. Use UTF-8 (que es más eficiente en la mayoría de los casos, y más comúnmente usado), o use wchar_t [].

+3

El OP dice que "en Windows wchar_t tiene dos bytes", por lo que no cabe un punto de código suplementario que sugiera que "todos encajan en un wchar_t" no es el caso. Estoy de acuerdo en que UTF-16 es una opción deficiente para la representación interna: tiene las desventajas tanto de UTF-8 (iteración más complicada) como de UTF-32 (distorsión de tamaño), pero es el estándar para cosas como ICU, por lo que puede hacer una interoperabilidad de biblioteca para ello. –