una respuesta muy parcial a la primera pregunta: ¿Un archivo es una secuencia de bytes por lo que, cuando se trata de wchar_t
's, al menos algunos de conversión entre wchar_t
y char
debe ocurrir. Hacer esta conversión de forma "inteligente" requiere el conocimiento de las codificaciones de caracteres, por lo que esta es la razón por la cual se permite que esta conversión dependa de la configuración regional, en virtud del uso de una faceta en la configuración regional de la secuencia.
Luego, la pregunta es cómo se debe hacer esa conversión en la única configuración regional requerida por la norma: la "clásica". No hay una respuesta "correcta" para eso, y el estándar es muy vago al respecto. Entiendo por su pregunta que usted supone que lanzar ciegamente (o memcpy() - ing) entre wchar_t [] y char [] hubiera sido una buena manera. Esto no es irracional, y de hecho es lo que se hace (o al menos se hizo) en algunas implementaciones.
Otro POV sería que, dado que un codecvt es una faceta de configuración regional, es razonable esperar que la conversión se realice utilizando la "codificación de la configuración regional" (aquí estoy manual, ya que el concepto es bastante confuso). Por ejemplo, uno esperaría que un local turco usara ISO-8859-9, o un japonés para usar Shift JIS. Por similitud, la configuración regional "clásica" se convertiría a esta "codificación de la configuración regional". Aparentemente, Microsoft eligió simplemente recortar (lo que lleva a IS-8859-1 si asumimos que wchar_t
representa UTF-16 y que nos mantenemos en el plano multilingüe básico), mientras que la implementación de Linux que conozco decidió adherirse a ASCII.
Para su segunda pregunta:
Además, estamos va a conseguir flujos reales Unicode con C++ 0x o me estoy perdiendo algo aquí?
En la sección [locale.codecvt] de n2857 (el último borrador C++ 0x tengo a mano), se puede leer:
La especialización codecvt<char16_t, char, mbstate_t>
convierte entre el UTF-16 y Los esquemas de codificación UTF-8 y la especialización codecvt <char32_t, char, mbstate_t>
convierten los esquemas de codificación UTF-32 y UTF-8. codecvt<wchar_t,char,mbstate_t>
convierte entre los juegos de caracteres nativos para caracteres angostos y anchos.
En la [configuración regional.stdcvt] sección, encontramos:
Para la faceta codecvt_utf8
: - La faceta deberá convertir entre UTF-8 secuencias de varios bytes y UCS2 o UCS4 (dependiendo del tamaño de Elem) dentro del programa. [...]
Para la faceta codecvt_utf16
: - La faceta deberá convertir entre UTF-16 secuencias de varios bytes y UCS2 o UCS4 (dependiendo del tamaño de Elem) dentro del programa. [...]
Para la faceta codecvt_utf8_utf16
: - La faceta deberá convertir entre UTF-8 secuencias de varios bytes y (uno o dos códigos de 16 bits) 16 UTF-dentro del programa.
Así que supongo que esto significa "sí", pero tendría que ser más preciso sobre lo que quiere decir con "transmisiones de Unicode reales" para estar seguro.
Buena pregunta. Espero que puedas desenterrar una respuesta. Personalmente me inclino por la teoría de "IOStreams es solo una biblioteca mal diseñada" ...;) Probablemente no ayude que Unicode no esté exactamente bien establecido cuando se diseñó la biblioteca. Podrían haber pensado que la serialización hacia/desde caracteres simples era el enfoque más portátil. – jalf
@jalf Gracias. No soy muy competente con las transmisiones pero esta pregunta me molesta mucho: D – AraK