Microsoft fue una de las primeras empresas en implementar Unicode en sus productos. Windows NT fue el primer sistema operativo que utilizó "caracteres anchos" en las llamadas al sistema . Utilizando el esquema de codificación UCS-2 al principio, se actualizó a UTF-16 a partir de Windows 2000 , lo que permite una representación de planos adicionales con pares sustitutos. Sin embargo, Microsoft no admitió UTF-8 hasta 2017. En mayo de 2019, Microsoft cambió de rumbo y comenzó a recomendar el uso exclusivo de UTF-8. [1] En Windows 11 , se requieren algunos archivos del sistema para usar UTF-8. [2]
En varias familias de Windows
Sistemas basados en Windows NT
Las versiones actuales de Windows y todas las versiones anteriores a Windows XP y Windows NT (3.x, 4.0) se envían con bibliotecas del sistema que admiten la codificación de cadenas de dos tipos: "Unicode" de 16 bits ( UTF-16 desde Windows 2000 ) y una ( a veces, codificación multibyte) denominada " página de códigos " (o denominada incorrectamente como página de códigos ANSI ). Las funciones de 16 bits tienen nombres con el sufijo 'W' (de "ancho" ) como SetWindowTextW
. Las funciones orientadas a la página de códigos usan el sufijo 'A' para "ANSI", como SetWindowTextA
(se usaron algunas otras convenciones para las API que se copiaron de otros sistemas, como _wfopen/fopen
o wcslen/strlen
). Esta división era necesaria porque muchos lenguajes, incluido C , no proporcionaban una forma limpia de pasar cadenas de 8 y 16 bits a la misma función.
Las funciones 'A' se implementan como envoltorios que traducen el texto usando la página de códigos actual a UTF-16 y luego llaman a las funciones 'W' correspondientes. [ cita requerida ] Las funciones 'A' que devuelven cadenas hacen la conversión opuesta, convirtiendo caracteres que no existen en la configuración regional actual en '?'.
Microsoft intentó admitir Unicode de forma "portátil" proporcionando un modificador "UNICODE" al compilador, que cambia las llamadas "genéricas" sin sufijo de la interfaz "A" a la "W" y convierte todas las constantes de cadena en versiones "amplias" de UTF-16 . [3] [4] Esto en realidad no funciona porque no traduce UTF-8 fuera de las constantes de cadena, lo que da como resultado un código que intenta abrir archivos simplemente no compilando. [ cita requerida ]
Anteriormente, e independientemente del modificador "UNICODE", Windows también proporcionaba el modificador de API de conjuntos de caracteres multibyte (MBCS). [5] Esto cambia algunas funciones que no funcionan en MBCS, por ejemplo, strrev
a una compatible con MBCS, como _mbsrev
. [6] [7]
La documentación de Microsoft utiliza el término "Unicode" para referirse a "no codificación de 8 bits". [ cita requerida ]
Windows CE
En Windows CE , UTF-16 se usó casi exclusivamente, con la API 'A' en su mayor parte ausente. [8] Un conjunto limitado de API ANSI está disponible en Windows CE 5.0, para su uso en un conjunto reducido de configuraciones regionales que pueden integrarse de forma selectiva en la imagen en tiempo de ejecución. [9]
Windows 9x
En 2001, Microsoft lanzó un suplemento especial para los antiguos sistemas Windows 9x de Microsoft . Incluye una biblioteca de enlaces dinámicos, 'unicows.dll', (solo 240 KB) que contiene el sabor de 16 bits (los que tienen la letra W al final) de todas las funciones básicas de la API de Windows. Es simplemente una capa de traducción: SetWindowTextW
simplemente convertirá su entrada usando la página de códigos actual y llamará SetWindowTextA
.
UTF-8
Microsoft Windows tiene una página de códigos designada para UTF-8 , página de códigos 65001. [10] Antes de Windows 10 insider build 17035 (noviembre de 2017), [11] era imposible establecer la página de códigos de configuración regional en 65001, dejando esta página de códigos solo disponible para (a) funciones de conversión explícitas como MultiByteToWideChar y / o (b) el comando de consola Win32chcp 65001
para traducir stdin / out entre UTF-8 y UTF-16. Esto significa que las funciones "limitadas", en particular fopen
(las que abren archivos), no se pueden llamar con cadenas UTF-8 y, de hecho, no hay forma de abrir todos los archivos posibles fopen
sin importar la configuración regional y / o Se colocan bytes en la cadena, ya que ninguna de las configuraciones regionales disponibles puede producir todos los caracteres UTF-16 posibles. Este problema también se aplica a todas las demás API que aceptan o devuelven cadenas de 8 bits, incluidas las de Windows como SetWindowText
.
Microsoft dijo que una configuración regional UTF-8 podría romper algunas funciones, ya que fueron escritas para asumir que las codificaciones multibyte no usaban más de 2 bytes por carácter, por lo que las páginas de códigos con más bytes como UTF-8 (y también GB 18030 , cp54936) no podrían establecerse como la configuración regional. [12]
En todas las plataformas modernas que no son de Windows, la cadena de nombre de archivo que se pasa fopen
es efectivamente UTF-8. Esto produce una incompatibilidad entre otras plataformas y Windows. La solución normal es agregar código específico de Windows para convertir UTF-8 a UTF-16 usando MultiByteToWideChar y llamar a la función "amplia" en lugar de fopen
. [13] Otra solución popular es convertir el nombre al equivalente de nombre de archivo 8.3 , esto es necesario si fopen
está dentro de una función de biblioteca que toma un nombre de archivo de cadena y, por lo tanto, no es posible llamar a otra función. También hubo propuestas para agregar nuevas API a bibliotecas portátiles como Boost para hacer la conversión necesaria, agregando nuevas funciones para abrir y renombrar archivos. Estas funciones pasarían nombres de archivos sin cambios en Unix, pero los traducirían a UTF-16 en Windows. Esta biblioteca, Boost.Nowide, [14] fue aceptada en Boost [15] y será parte de la versión 1.73. [ necesita actualización ] Esto permitiría que el código sea "portátil", pero requiere tantos cambios de código como llamar a las funciones amplias.
En abril de 2018, con la compilación interna 17035 (compilación nominal 17134) para Windows 10, apareció una casilla de verificación "Beta: Use Unicode UTF-8 para compatibilidad con idiomas en todo el mundo" para configurar la página de códigos de configuración regional en UTF-8. [a] Esto permite llamar a funciones "limitadas", incluyendo fopen
y SetWindowTextA
, con cadenas UTF-8. En mayo de 2019, Microsoft agregó la capacidad de un programa para configurar la página de códigos en UTF-8 y comenzó a recomendar que todo el software hiciera esto y usara UTF-8 exclusivamente. [1]
Plataformas de programación
Los compiladores de Microsoft a menudo fallan al producir constantes de cadena UTF-8 a partir de archivos fuente UTF-8. El método más confiable es apagar UNICODE, no marcar el archivo de entrada como UTF-8 (es decir, no usar una lista de materiales ) y organizar las constantes de cadena para que tengan los bytes UTF-8. Si se agregó una lista de materiales, un compilador de Microsoft interpretará las cadenas como UTF-8, las convertirá a UTF-16 y luego las volverá a convertir a la configuración regional actual, destruyendo así el UTF-8. [16] Sin una lista de materiales y utilizando una configuración regional de un solo byte, los compiladores de Microsoft dejarán los bytes en una cadena entre comillas sin cambios.
Ver también
- Bush ocultó los hechos , un texto codificado en mojibake
Notas
- ^ Se encuentra en el panel de control, entrada "Región", pestaña "Administrativo", botón "Cambiar configuración regional del sistema".
Referencias
- ^ a b "Usar la página de códigos de Windows UTF-8 - Aplicaciones para UWP" . docs.microsoft.com . Consultado el 6 de junio de 2020 .
A partir de la versión 1903 de Windows (actualización de mayo de 2019), puede usar la propiedad ActiveCodePage en appxmanifest para aplicaciones empaquetadas, o el manifiesto de fusión para aplicaciones no empaquetadas, para forzar que un proceso use UTF-8 como la página de códigos de proceso. [..]
CP_ACP
equivale aCP_UTF8
solo si se ejecuta en la versión 1903 de Windows (actualización de mayo de 2019) o superior y la propiedad ActiveCodePage descrita anteriormente está establecida en UTF-8. De lo contrario, respeta la página de códigos del sistema heredado. Recomendamos usarCP_UTF8
explícitamente. - ^ themar-msft. "Personalizar el menú Inicio de Windows 11" . docs.microsoft.com . Consultado el 29 de junio de 2021 .
Asegúrese de que su LayoutModification.json use codificación UTF-8.
- ^ "Unicode en la API de Windows" . Consultado el 7 de mayo de 2018 .
- ^ "Convenciones para prototipos de funciones (Windows)" . MSDN . Consultado el 7 de mayo de 2018 .
- ^ "Soporte para juegos de caracteres multibyte (MBCS)" . Consultado el 15 de junio de 2020 .
- ^ "Juegos de caracteres de doble byte" . MSDN . 2018-05-31 . Consultado el 15 de junio de 2020 .
nuestras aplicaciones utilizan páginas de códigos DBCS de Windows con las versiones "A" de las funciones de Windows.
- ^ _strrev, _wcsrev, _mbsrev, _mbsrev_l Microsoft Docs
- ^ "Diferencias entre las implementaciones de Windows CE y Windows NT de TAPI" . MSDN . Consultado el 7 de mayo de 2018 .
Windows CE está basado en Unicode. Es posible que deba volver a compilar el código fuente que se escribió para una aplicación basada en Windows NT.
- ^ "Páginas de códigos (Windows CE 5.0)" . Microsoft Docs . Consultado el 7 de mayo de 2018 .
- ^ "Identificadores de página de códigos (Windows)" . msdn.microsoft.com .
- ^ "Windows10 Insider Preview Build 17035 admite UTF-8 como ANSI" . Noticias de hackers . Consultado el 7 de mayo de 2018 .
- ^ Foros de MSDN
- ^ "UTF-8 en Windows" . Desbordamiento de pila . Consultado el 1 de julio de 2011 .
- ^ "Boost.Nowide" .
- ^ "Impulsar la lista de correo" .
- ^ Preguntas frecuentes sobre UTF-8 Everywhere: ¿Cómo escribo literal de cadena UTF-8 en mi código C ++?
enlaces externos
- "Unicode" . MSDN . Microsoft . Consultado el 10 de noviembre de 2016 .