conflictos: definición de la cadena wchar_t en el estándar C ++ y la implementación de Windows?

De c ++ 2003 2.13

Un literal de cadena ancha tiene el 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'.

Desde c ++ 0x 2.14.5

Un literal de cadena ancha 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 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, el literal de cadena ancha wchar_t se tratará igual que char32_t y diferente de char16_t.

Hay una publicación que establece claramente cómo Windows implementa wchar_t enhttps://stackoverflow.com/questions/402283?tab=votes%23tab-top

En resumen, wchar_t en Windows tiene 16 bits y está codificado con UTF-16. La declaración en el estándar aparentemente deja algo conflictivo en Windows.

por ejemplo,

wchar_t kk[] = L"\U000E0005";

Esto excede los 16 bits y para UTF-16 necesita dos 16 bits para codificarlo (un par sustituto).

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 sustituto y 1 wchar_t para \ 0. Por lo tanto, desde la definición de la matriz, kk es una matriz de 3 wchar_t.

Aparentemente está en conflicto entre sí.

Creo que una solución más simple para Windows es "prohibir" cualquier cosa que requiera un par sustituto en wchar_t ("prohibir" cualquier Unicode fuera de BMP).

¿Hay algo malo con mi comprensión?

Gracias.

Respuestas a la pregunta(2)

Su respuesta a la pregunta