Usa la página de códigos UTF-8Use the UTF-8 code page

Use la codificación de caracteres UTF-8 para ofrecer una compatibilidad óptima entre las aplicaciones web y otras * plataformas basadas en Nix (UNIX, Linux y variantes), minimizar los errores de localización y reducir la sobrecarga de las pruebas.Use UTF-8 character encoding for optimal compatibility between web apps and other *nix-based platforms (Unix, Linux, and variants), minimize localization bugs, and reduce testing overhead.

UTF-8 es la página de códigos universal para la internacionalización y puede codificar todo el juego de caracteres Unicode.UTF-8 is the universal code page for internationalization and is able to encode the entire Unicode character set. Se usa de forma generalizada en la web y es el valor predeterminado para las plataformas basadas en * nix.It is used pervasively on the web, and is the default for *nix-based platforms.

Nota

Un carácter codificado toma entre 1 y 4 bytes.An encoded character takes between 1 and 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.UTF-8 encoding supports longer byte sequences, up to 6 bytes, but the biggest code point of Unicode 6.0 (U+10FFFF) only takes 4 bytes.

-Una API de vs.-W-A vs. -W APIs

Las API de Win32 suelen admitir las variantes-A y-W.Win32 APIs often support both -A and -W variants.

-Las variantes reconocen la página de códigos ANSI configurada en el sistema y admiten char* , mientras que las variantes de-W funcionan en UTF-16 y admiten WCHAR .-A variants recognize the ANSI code page configured on the system and support char*, while -W variants operate in UTF-16 and support WCHAR.

Hasta hace poco, Windows ha resaltado "Unicode"-W variantes a través de las API.Until recently, Windows has emphasized "Unicode" -W variants over -A APIs. Sin embargo, las versiones recientes han usado la página de códigos ANSI y las API como un medio para introducir la compatibilidad con UTF-8 en las aplicaciones.However, recent releases have used the ANSI code page and -A APIs as a means to introduce UTF-8 support to apps. Si la página de códigos ANSI está configurada para UTF-8,-las API funcionan en UTF-8.If the ANSI code page is configured for UTF-8, -A APIs operate in UTF-8. Este modelo tiene la ventaja de admitir el código existente compilado con las API-A sin necesidad de realizar ningún cambio en el código.This model has the benefit of supporting existing code built with -A APIs without any code changes.

Establecer una página de códigos del proceso en UTF-8Set a process code page to UTF-8

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 sin empaquetar, a fin de forzar que un proceso use UTF-8 como página de códigos del proceso.As of Windows Version 1903 (May 2019 Update), you can use the ActiveCodePage property in the appxmanifest for packaged apps, or the fusion manifest for unpackaged apps, to force a process to use UTF-8 as the process code page.

Puede declarar esta propiedad y destino o ejecutar en compilaciones anteriores de Windows, pero debe administrar la detección y conversión de páginas de códigos heredadas como de costumbre.You can declare this property and target/run on earlier Windows builds, but you must handle legacy code page detection and conversion as usual. Con una versión de destino mínima de la versión 1903 de Windows, la página de códigos del proceso siempre será UTF-8, por lo que la detección y conversión de la página de códigos heredada se puede evitar.With a minimum target version of Windows Version 1903, the process code page will always be UTF-8 so legacy code page detection and conversion can be avoided.

EjemplosExamples

Manifiesto de appx para una aplicación empaquetada:Appx manifest for a packaged app:

<?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 desempaquetada:Fusion manifest for an unpackaged Win32 app:

<?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>;#1Add a manifest to an existing executable from the command line with mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1

Conversión de páginas de códigosCode page conversion

Como Windows funciona de forma nativa en UTF-16 ( WCHAR ), es posible que tenga que convertir los datos UTF-8 a UTF-16 (o viceversa) para interoperar con las API de Windows.As Windows operates natively in UTF-16 (WCHAR), you might need to convert UTF-8 data to UTF-16 (or vice versa) to interoperate with Windows APIs.

MultiByteToWideChar y WideCharToMultiByte permiten realizar conversiones entre UTF-8 y UTF-16 ( WCHAR ) (y otras páginas de códigos).MultiByteToWideChar and WideCharToMultiByte let you convert between UTF-8 and UTF-16 (WCHAR) (and other code pages). Esto es especialmente útil cuando una API de Win32 heredada solo puede entender WCHAR .This is particularly useful when a legacy Win32 API might only understand WCHAR. Estas funciones permiten convertir la entrada UTF-8 en WCHAR para pasar a una API-W y, a continuación, volver a convertir los resultados si es necesario.These functions allow you to convert UTF-8 input to WCHAR to pass into a -W API and then convert any results back if necessary. Cuando se usan estas funciones con CodePage establecido en CP_UTF8 , dwFlags se usa 0 o MB_ERR_INVALID_CHARS , en caso contrario, ERROR_INVALID_FLAGS se produce una.When using these functions with CodePage set to CP_UTF8, use dwFlags of either 0 or MB_ERR_INVALID_CHARS, otherwise an ERROR_INVALID_FLAGS occurs.

Nota

CP_ACP equivale a CP_UTF8 solo si se ejecuta en la versión 1903 de Windows (actualización 2019 de mayo) o superior y la propiedad ActiveCodePage descrita anteriormente está establecida en UTF-8.CP_ACP equates to CP_UTF8 only if running on Windows Version 1903 (May 2019 Update) or above and the ActiveCodePage property described above is set to UTF-8. De lo contrario, respeta la página de códigos del sistema heredado.Otherwise, it honors the legacy system code page. Se recomienda usar CP_UTF8 explícitamente.We recommend using CP_UTF8 explicitly.