La naturaleza exacta de los caracteres anchos es (a propósito) la implementación izquierda definida.
Cuando inventaron por primera vez el concepto de wchar_t
, ISO 10646 y Unicode seguían compitiendo entre sí (mientras que ahora, en su mayoría cooperan). En lugar de intentar decretar que un personaje internacional sería uno u otro (o posiblemente algo completamente diferente), simplemente proporcionaron un tipo (y algunas funciones) que la implementación podría definir para admitir conjuntos de caracteres internacionales según lo que eligieran.
Diferentes implementaciones tienen ejercido ese potencial de variación. Por ejemplo, si usa el compilador de Microsoft en Windows, wchar_t
será un tipo de 16 bits que contenga UTF-16 Unicode (originalmente contenía UCS-2 Unicode, pero ahora oficialmente está obsoleto).
En Linux, wchar_t
suele ser un tipo de 32 bits que contiene Unicode codificado UCS-4/UTF-32. Los puertos de gcc al menos a algunos otros sistemas operativos hacen lo mismo, aunque nunca he intentado confirmar que siempre sea el caso.
Sin embargo, no hay garantía de eso. Al menos en teoría, una implementación en Linux podría usar 16 bits, o uno en Windows podría usar 32 bits, o cualquiera podría decidir usar 64 bits (aunque me sorprendería un poco ver eso en realidad).
En cualquier caso, la idea general de cómo son las cosas destinados a trabajar, es que una sola wchar_t
es suficiente para representar un punto de código. Para E/S, los datos están destinados a convertirse desde la representación externa (lo que sea) en wchar_t
s, lo que (se supone que) hace que sean relativamente fáciles de manipular. Luego, durante la salida, nuevamente se transforman en la codificación que elijas (que puede ser completamente diferente de la codificación que lees).
Empiece aquí http://www.joelonsoftware.com/articles/Unicode.html –
El primer parámetro es realmente del tipo 'wchar_t []', sutilmente diferente de 'wchar_t *'. – dreamlax