De C++ 2003 2,13conflictos: definición de cadena wchar_t en C++ estándar y la implementación de Windows?
Una amplia cadena literal tiene tipo “matriz de n const wchar_t” y tiene una duración de almacenamiento estático, donde n es el tamaño de la cadena como se define a continuación
El tamaño de un literal de cadena ancha es el número total de secuencias de escape, nombres de caracteres universales y otros caracteres, más uno para la terminación L '\ 0'.
De C++ 0x 2.14.5
Una amplia cadena literal tiene el tipo “matriz de n const wchar_t”, donde n es el tamaño de la cadena como se define a continuación
El el tamaño de un char32_t o literal de cadena ancha es el número total de secuencias de escape, nombres de caracteres universales y otros caracteres, más uno para la terminación U '\ 0' o L '\ 0'.
El tamaño de un literal de cadena char16_t es el número total de secuencias de escape, nombres de caracteres universales y otros caracteres, más uno para cada carácter que requiere un par sustituto, más uno para la terminación u '\ 0'.
La declaración en C++ 2003 es bastante vaga. Pero en C++ 0x, al contar la longitud de la cadena, la cadena ancha literal wchar_t se tratará igual que char32_t, y diferente de char16_t.
Hay un mensaje que indica claramente cómo las ventanas wchar_t implementa en https://stackoverflow.com/questions/402283?tab=votes%23tab-top
En resumen, wchar_t en las ventanas es 16bits y codificado con UTF-16. La declaración en estándar aparentemente deja algo conflictivo en Windows.
por ejemplo,
wchar_t kk[] = L"\U000E0005";
Esto supera 16bits y para UTF-16 que necesita dos 16 bits para codificar (un par suplente).
Sin embargo, desde el estándar, kk es una matriz de 2 wchar_t (1 para el nombre universal \ U000E005, 1 para \ 0).
Pero en el almacenamiento interno, Windows necesita 3 objetos wchar_t de 16 bits para almacenarlo, 2 wchar_t para el par suplente y 1 wchar_t para el \ 0. Por lo tanto, a partir de la definición de la matriz, kk es una matriz de 3 wchar_t.
Aparentemente es incompatible entre sí.
Creo que la solución más simple para Windows es "prohibir" cualquier cosa que requiera un par suplente en wchar_t ("prohibir" cualquier unicode fuera de BMP).
¿Hay algún problema con mi comprensión?
Gracias.
gracias. lo entiendo ahora. En algún momento es difícil entender un nuevo concepto, pero una vez que lo tienes, se vuelve más simple al instante. – user534498
Windows técnicamente usa 'WCHAR', no' wchar_t'. Se ha defraudado como 'unsigned short' en el pasado y podría convertirse en' char16_t' en el futuro. Pero, sinceramente, no veo que eso suceda, los literales de cadenas se romperían. – MSalters
@MSalters: ¿Por qué se romperían los literales de cadena? Para eso están las macros 'TEXT (" ... ")', nunca se suponía que las personas usaran literales en bruto 'L' ... ''. Además, al menos en VS2005, 'WCHAR' es un tipodef para' wchar_t', no 'unsigned short'. – casablanca