Uso de páginas de códigos UTF-8 en aplicaciones de Windows
Use la codificación de caracteres UTF-8 para una compatibilidad óptima entre las aplicaciones web y otras plataformas basadas en nix (Unix, Linux y variantes), minimice los errores de localización y reduzca la sobrecarga de pruebas.
UTF-8 es la página de códigos universal para la internacionalización y es capaz de codificar todo el juego de caracteres Unicode. Se usa generalizadamente en la Web y es el valor predeterminado para las plataformas basadas en *nix.
Establecer una página de códigos de proceso en UTF-8
A partir de Windows versión 1903 (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 un proceso para usar UTF-8 como página de códigos del proceso.
Puede declarar esta propiedad y target/run en compilaciones anteriores Windows, pero debe controlar la detección y conversión de páginas de códigos heredadas como de costumbre. Con una versión de destino mínima de Windows versión 1903, la página de códigos del proceso siempre será UTF-8 para que se pueda evitar la conversión y la detección de páginas de códigos heredadas.
Nota
Un carácter codificado toma entre 1 y 4 bytes. La codificación UTF-8 admite secuencias de bytes más largas, hasta 6 bytes, pero el punto de código más grande de Unicode 6.0 (U+10FFFF) solo toma 4 bytes.
Ejemplos
Manifiesto appx para una aplicación empaquetada:
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
...
xmlns:uap7="http://schemas.microsoft.com/appx/manifest/uap/windows10/7"
xmlns:uap8="http://schemas.microsoft.com/appx/manifest/uap/windows10/8"
...
IgnorableNamespaces="... uap7 uap8 ...">
<Applications>
<Application ...>
<uap7:Properties>
<uap8:ActiveCodePage>UTF-8</uap8:ActiveCodePage>
</uap7:Properties>
</Application>
</Applications>
</Package>
Manifiesto de fusión para una aplicación Win32 sin empaquetar:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity type="win32" name="..." version="6.0.0.0"/>
<application>
<windowsSettings>
<activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
</windowsSettings>
</application>
</assembly>
Nota
Agregar un manifiesto a un ejecutable existente desde la línea de comandos con mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1
-A frente a -W API
Las API de Win32 suelen admitir variantes -A y -W.
-Una variante reconoce la página de códigos ANSI configurada en el sistema y admite char*, mientras que las variantes -W funcionan en UTF-16 y admiten WCHAR.
Hasta hace poco, Windows ha resaltado las variantes "Unicode" -W en las API -A. Sin embargo, las versiones recientes han usado la página de códigos ANSI y las API -A como medio para introducir compatibilidad con UTF-8 para las aplicaciones. Si la página de códigos ANSI está configurada para UTF-8, las API de -A suelen funcionar en UTF-8. Este modelo tiene la ventaja de admitir código existente creado con -A API sin cambios en el código.
Conversión de página de códigos
Como Windows funciona de forma nativa en UTF-16 (WCHAR), es posible que tenga que convertir datos UTF-8 a UTF-16 (o viceversa) para interoperar con Windows API.
MultiByteToWideChar y WideCharToMultiByte permiten convertir entre UTF-8 y UTF-16 () (WCHARy otras páginas de códigos). Esto es especialmente útil cuando una API de Win32 heredada solo puede comprender WCHAR. Estas funciones permiten convertir la entrada UTF-8 en WCHAR para pasar a una API -W y, a continuación, convertir los resultados de nuevo si es necesario.
Cuando se usan estas funciones con CodePage establecido en CP_UTF8, se produce el uso dwFlags de 0 o MB_ERR_INVALID_CHARS, de lo contrario, se produce .ERROR_INVALID_FLAGS
Nota
CP_ACPequivale a CP_UTF8 solo si se ejecuta en Windows versión 1903 (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 heredada. Se recomienda usar CP_UTF8 explícitamente.