windows utf-8 mbcs

windows - ¿Por qué no se permite UTF-8 como la página de códigos "ANSI"?



mbcs (3)

La página de códigos "ANSI" es básicamente heredada: la era de Windows 9X. Todo el software moderno debe estar basado en Unicode (es decir, UTF-16) de todos modos.

Básicamente, cuando las cosas de la página de códigos de Ansi se diseñaron originalmente, UTF-8 ni siquiera se inventó y, por lo tanto, el soporte para codificaciones de múltiples bytes fue bastante azaroso (es decir, la mayoría de las páginas de códigos de Ansi son de un solo byte, con la excepción de algunas páginas de códigos de Asia Oriental que son uno o dos bytes). Añadir soporte para codificaciones de múltiples bytes "adecuadas" probablemente se consideró que no valía la pena el esfuerzo cuando, de todos modos, todo nuevo desarrollo debería realizarse en UTF-16.

La función _setmbcp Windows permite cualquier página de códigos válida ...

(excepto UTF-7 y UTF-8, que no son compatibles)

De acuerdo, no es compatible con UTF-7: los caracteres tienen representaciones no únicas y eso introduce complejidad y riesgos de seguridad.

¿Pero por qué no UTF-8?

Como lo entiendo, las versiones "ANSI" de las funciones de la API de Windows convierten sus argumentos a UTF-16, llaman a la función "W" equivalente y convierten cualquier cadena en la salida a "ANSI". Esto es lo que he estado haciendo manualmente. Entonces, ¿por qué Windows no puede hacerlo por mí?


Michael Kaplan, un experto en internacionalización de Microsoft, trató de responder esto en su blog .

Básicamente, su explicación es que a pesar de que las versiones "ANSI" de las funciones de la API de Windows están diseñadas para manejar diferentes páginas de códigos, históricamente había una expectativa implícita de que las codificaciones de caracteres requerirían un máximo de dos bytes por punto de código. UTF-8 no cumple con esa expectativa, y cambiar todas esas funciones ahora requeriría una gran cantidad de pruebas.


_setmbcp() es una función RTL de VC ++, no una función de API Win32. Sólo afecta a cómo el RTL interpreta las cadenas. No tiene ningún efecto sobre las funciones de la API de Win32. Cuando llaman internamente a sus contrapartes W , las funciones A siempre usan MultiByteToWideChar() y WideCharToMultiByte() especifican la página de códigos 0 ( CP_ACP ) para usar la página de códigos Ansi predeterminada del sistema para las conversiones.