web-dev-qa-db-fra.com

Que fait réellement "Bêta: utiliser Unicode UTF-8 pour la prise en charge des langues dans le monde"?

Dans certaines versions de Windows 10 (initiés à partir d'avril 2018 et également 1903 "normal"), il existe une nouvelle option appelée "Bêta: utilisez Unicode UTF-8 pour la prise en charge des langues dans le monde entier".

Vous pouvez voir cette option en allant dans Paramètres puis: Tous les paramètres -> Heure et langue -> Langue -> "Paramètres de langue administrative"

Voici à quoi ça ressemble:

enter image description here

Lorsque cette case est cochée, j'observe quelques irrégularités (ci-dessous) et Je voudrais savoir exactement ce que fait cette case et pourquoi cela se produit .

Créez une toute nouvelle application Windows Forms dans votre Visual Studio 2019. Sur le formulaire principal, spécifiez le gestionnaire pair Paint comme suit:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Font buttonFont = new Font("Webdings", 9.25f);
    TextRenderer.DrawText(e.Graphics, "0r", buttonFont, new Point(), Color.Black);
}

Exécutez le programme, voici ce que vous verrez si la case n'est PAS cochée:

enter image description here

Cependant, si vous cochez la case (et redémarrez comme demandé), cela se transforme en:

enter image description here

Vous pouvez rechercher la police Webdings sur Wikipédia. Selon la table de caractères donnée, les codes de ces deux caractères sont "\U0001F5D5\U0001F5D9". Si je les utilise au lieu de "0r" ça marche avec la case cochée mais sans la case cochée ça ressemble maintenant à ceci:

enter image description here

Je voudrais trouver une solution qui toujours fonctionne, que la case soit cochée ou décochée.

Cela peut-il être fait?

12
Andrew Savinykh

La plupart des API Windows C sont disponibles en deux variantes différentes:

  • Variante "A" qui utilise des chaînes de 8 bits avec le codage configuré par les systèmes. Cela varie en fonction du pays/de la langue configurés. (Microsoft appelle l'encodage configuré la "page de codes ANSI", mais ce n'est pas vraiment quelque chose à voir avec ANSI).
  • Variante "W" qui utilise des chaînes de 16 bits dans un codage fixe presque UTF-16. (Le "presque" est dû au fait que les "substituts non appariés" sont autorisés; si vous ne savez pas de quoi il s'agit, ne vous en faites pas).

Le conseil officiel de Microsoft n'est pas d'utiliser les versions "A", mais de s'assurer que votre code utilise toujours les variantes "W". De cette façon, vous êtes censé obtenir un comportement cohérent, quel que soit le pays/la langue de l'utilisateur configuré.

Cependant, il semble que cette case à cocher fasse plus d'une chose. Il est clair qu'il est censé changer la "page de codes ANSI" en 65001, ce qui signifie UTF-8. Il semble que cela change également le rendu des polices pour être plus Unicody.

Je vous suggère de détecter si GetACP () == 65001 , puis dessinez la version Unicode de vos chaînes, sinon dessinez l'ancienne version "0r". Je ne sais pas comment tu fais ça depuis .NET ...

1
user9876