Utiliser des pages de codes UTF-8 dans des applications Windows

Utilisez le codage de caractères UTF-8 pour une compatibilité optimale entre les applications web et d’autres plateformes *nix (Unix, Linux et variantes), réduisez les bogues de localisation et réduisez le traitement de test.

UTF-8 est la page de codes universelle pour l’internationalisation et est en mesure d’encoder l’ensemble du jeu de caractères Unicode. Il est utilisé de manière omniprésente sur le web et est la valeur par défaut pour les plateformes *nix.

Définir une page de codes de processus sur UTF-8

À compter de Windows Version 1903 (mise à jour de mai 2019), vous pouvez utiliser la propriété ActiveCodePage dans l’appxmanifest pour les applications empaquetées ou le manifeste de fusion pour les applications non empaquetées, afin de forcer un processus à utiliser UTF-8 comme page de codes de processus.

Remarque

GDI ne prend actuellement pas en charge la définition de la propriété ActiveCodePage par processus. Au lieu de cela, GDI est défini par défaut sur la page de codes système active. Pour configurer votre application pour afficher du texte UTF-8 via GDI, accédez à Windows Paramètres>Heure et langue>Langue et région>Paramétrage de langue administrative>Changer les paramètres régionaux système, et vérifier Bêta: Utilisez l'Unicode UTF-8 pour la prise en charge des langues dans le monde entier. Redémarrez ensuite l'ordinateur pour que les modifications soient prises en compte.

Vous pouvez déclarer la propriété ActiveCodePage et cibler/exécuter sur des versions antérieures de Windows, mais vous devez gérer la détection et la conversion des pages de code héritées comme d'habitude. Avec une version cible minimale de Windows Version 1903, la page de codes de processus sera toujours UTF-8, de sorte que la détection et la conversion de pages de codes héritées peuvent être évitées.

Remarque

Un caractère encodé prend entre 1 et 4 octets. L’encodage UTF-8 prend en charge des séquences d’octets plus longues, jusqu’à 6 octets, mais le code de caractère le plus important d’Unicode 6.0 (U+10FFFF) ne prend que 4 octets.

Exemples

Manifeste Appx pour une application empaquetée :

<?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>

Manifeste fusion pour une application Win32 non empaquetée :

<?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>

Remarque

Ajoutez un manifeste à un exécutable existant à partir de la ligne de commande avec mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1.

-A et -W API

Les API Win32 prennent souvent en charge les variantes -A et -W.

-Les variantes reconnaissent la page de codes ANSI configurée sur le système et la prise en charge char*, tandis que les variantes -W fonctionnent dans UTF-16 et prennent en charge WCHAR.

Jusqu’à récemment, Windows a mis l’accent sur les variantes « Unicode » -W sur les API -A. Toutefois, les versions récentes ont utilisé la page de codes ANSI et les API -A comme moyen d’introduire la prise en charge de UTF-8 pour les applications. Si la page de codes ANSI est configurée pour UTF-8, les API -A fonctionnent généralement dans UTF-8. Ce modèle présente l’avantage de prendre en charge le code existant créé avec les API -A sans aucune modification de code.

Conversions de pages de code

Étant donné que Windows fonctionne en mode natif dans UTF-16 (WCHAR), vous devrez peut-être convertir des données UTF-8 en UTF-16 (ou vice versa) pour interagir avec les API Windows.

MultiByteToWideChar et WideCharToMultiByte vous permettent de convertir entre UTF-8 et UTF-16 (WCHAR) (et d’autres pages de codes). Cela est particulièrement utile lorsqu’une API Win32 héritée peut uniquement comprendre WCHAR. Ces fonctions vous permettent de convertir l’entrée UTF-8 pour WCHAR passer dans une API -W, puis de convertir les résultats si nécessaire.

Utilisez dwFlags de 0 ou MB_ERR_INVALID_CHARS lorsque vous utilisez ces fonctions et que CodePage est réglé sur CP_UTF8 (sinon un ERROR_INVALID_FLAGS se produit).

Remarque

CP_ACP équivaut à CP_UTF8 uniquement si l’exécution sur Windows Version 1903 (mise à jour de mai 2019) ou ultérieure et que la propriété ActiveCodePage décrite ci-dessus est définie sur UTF-8. Sinon, il respecte la page de codes système héritée. Nous vous recommandons d’utiliser CP_UTF8 explicitement.