web-dev-qa-db-de.com

Was macht "Beta: Verwenden Sie Unicode UTF-8 für die weltweite Sprachunterstützung" tatsächlich?

In einigen Windows 10-Builds (Insider ab April 2018 und auch "normal" 1903) gibt es eine neue Option namens "Beta: Verwenden Sie Unicode UTF-8 für weltweite Sprachunterstützung".

Sie können diese Option sehen, indem Sie zu Einstellungen gehen und dann: Alle Einstellungen -> Zeit & Sprache -> Sprache -> "Einstellungen für die Verwaltungssprache"

So sieht es aus:

(enter image description here

Wenn dieses Kontrollkästchen aktiviert ist, stelle ich einige Unregelmäßigkeiten fest (unten) und Ich möchte wissen, was genau dieses Kontrollkästchen bewirkt und warum das Folgende passiert .

Erstellen Sie eine brandneue Windows Forms-Anwendung in Ihrem Visual Studio 2019. Geben Sie im Hauptformular den geraden Handler Paint wie folgt an:

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);
}

Führen Sie das Programm aus. Wenn das Kontrollkästchen NICHT aktiviert ist, sehen Sie Folgendes:

(enter image description here

Wenn Sie jedoch das Kontrollkästchen aktivieren (und wie gewünscht neu starten), ändert sich dies zu:

(enter image description here

Sie können die Schriftart Webdings auf Wikipedia nachschlagen. Gemäß der angegebenen Zeichentabelle lauten die Codes für diese beiden Zeichen "\U0001F5D5\U0001F5D9". Wenn ich sie anstelle von "0r" Verwende, funktioniert es mit das Kontrollkästchen aktiviert, aber ohne das Kontrollkästchen aktiviert sieht es jetzt so aus:

(enter image description here

Ich möchte eine Lösung finden, die immer funktioniert, unabhängig davon, ob das Kontrollkästchen aktiviert oder deaktiviert ist.

Kann das gemacht werden?

12
Andrew Savinykh

Die meisten Windows C-APIs gibt es in zwei verschiedenen Varianten:

  • "Eine" Variante, die 8-Bit-Zeichenfolgen mit der vom System konfigurierten Codierung verwendet. Dies hängt vom konfigurierten Land/der konfigurierten Sprache ab. (Microsoft nennt die konfigurierte Codierung "ANSI-Codepage", hat aber eigentlich nichts mit ANSI zu tun).
  • "W" -Variante, die 16-Bit-Zeichenfolgen in einer festen Fast-UTF-16-Codierung verwendet. (Das "fast" ist, weil "ungepaarte Leihmütter" erlaubt sind; wenn Sie nicht wissen, was diese sind, dann machen Sie sich keine Sorgen um sie).

Der offizielle Microsoft-Rat lautet, nicht die "A" -Versionen zu verwenden, sondern sicherzustellen, dass Ihr Code immer die "W" -Varianten verwendet. Auf diese Weise sollten Sie ein konsistentes Verhalten erzielen, unabhängig davon, als welches Land/welche Sprache der Benutzer konfiguriert ist.

Es sieht jedoch so aus, als ob das Kontrollkästchen mehr als eine Sache tut. Es ist klar, dass die "ANSI-Codepage" in 65001 geändert werden soll, was UTF-8 bedeutet. Es sieht so aus, als würde auch die Schriftwiedergabe so geändert, dass sie mehr Unicody ist.

Ich schlage vor, Sie erkennen, ob GetACP () == 65001 , und zeichnen dann die Unicode-Version Ihrer Zeichenfolgen, andernfalls die alte "0r" -Version. Ich bin mir nicht sicher, wie Sie das mit .NET machen ...

1
user9876