Verwenden von UTF-8-Codepages in Windows-Apps
Mit der UTF-8-Zeichencodierung können Sie für optimale Kompatibilität zwischen Web-Apps und anderen *nix-basierten Plattformen (Unix, Linux und Varianten) sorgen, Lokalisierungsfehler minimieren und den Testaufwand verringern.
UTF-8 ist die universelle Codepage für die Internationalisierung und kann den gesamten Unicode-Zeichensatz codieren. Sie kommt im Web verbreitet zum Einsatz und ist Standard bei *nix-basierten Plattformen.
Festlegen einer Prozesscodepage auf UTF-8
Ab Windows Version 1903 (Update vom Mai 2019) können Sie über die Eigenschaft ActiveCodePage im Appx-Manifest für gepackte Apps oder im Fusionsmanifest für ungepackte Apps einen Prozess zur Verwendung von UTF-8 als Prozesscodepage erzwingen.
Hinweis
Von GDI wird das Festlegen der Eigenschaft ActiveCodePage pro Prozess derzeit nicht unterstützt. Stattdessen legt GDI standardmäßig die aktive Systemcodepage fest. Wenn Sie Ihre App so zu konfigurieren möchten, dass UTF-8-Text über GDI gerendert wird, gehen Sie zu Windows Einstellungen>Zeit und Sprache>Sprache und Region>Administrative Sprachoptionen>Gebietsschema ändern und markieren Sie Beta: Unicode UTF-8 für die Unterstützung weltweiter Sprachen verwenden. Starten Sie den PC dann neu, damit die Änderung wirksam wird.
Sie können die Eigenschaft ActiveCodePage und die Zielsetzung/Ausführung auf früheren Windows-Builds deklarieren, müssen aber die Erkennung und Konvertierung älterer Codepages wie gewohnt vornehmen. Bei einer Mindestzielversion von Windows Version 1903 ist die Prozesscodepage immer UTF-8, sodass die Erkennung und Konvertierung älterer Codepages entfallen kann.
Hinweis
In UTF-8 wird ein codiertes Zeichen durch eine Sequenz von 1 bis 4 Bytes dargestellt. (Siehe Definition D92 in Kapitel 3 von Der Unicode-Standard für die formale Spezifikation.)
Beispiele
Appx-Manifest für eine gepackte 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>
Fusionsmanifest für eine ungepackte 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>
Hinweis
Fügen Sie über die Befehlszeile mit mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1
ein Manifest zu einer vorhandenen ausführbaren Datei hinzu.
-A- bzw. -W-APIs
Win32-APIs unterstützen oft sowohl -A- als auch -W-Varianten.
-A-Varianten erkennen die auf dem System konfigurierte ANSI-Codepage und unterstützen char*
, während -W-Varianten mit UTF-16 arbeiten und WCHAR
unterstützen.
Bis vor kurzem hat Windows „Unicode“-W-Varianten den -A-APIs vorgezogen. Neuere Releases verwenden jedoch die ANSI-Codepage und -A-APIs als Mittel zur Einführung der UTF-8-Unterstützung für Apps. Wenn die ANSI-Codepage für UTF-8 konfiguriert ist, arbeiten -A-APIs in der Regel mit UTF-8. Dieses Modell hat den Vorteil, dass ohne Codeänderungen der in -A-APIs vorhandene Code unterstützt wird.
Codepage-Konvertierung
Da Windows nativ mit UTF-16 (WCHAR
) arbeitet, müssen Sie für das Zusammenwirken mit Windows-APIs gegebenenfalls UTF-8-Daten in UTF-16 konvertieren (oder umgekehrt).
MultiByteToWideChar und WideCharToMultiByte ermöglichen das Konvertieren zwischen UTF-8 und UTF-16 (WCHAR
) (und anderen Codepages). Das ist besonders hilfreich, wenn eine ältere Win32-API eventuell nur WCHAR
versteht. Mit diesen Funktionen können Sie UTF-8-Eingaben in WCHAR
konvertieren, um sie an eine -W-API zu übergeben, und dann die Ergebnisse bei Bedarf zurückkonvertieren.
Verwenden Sie dwFlags
von 0
oder MB_ERR_INVALID_CHARS
, wenn Sie diese Funktionen mit CodePage
auf CP_UTF8
gesetzt verwenden (andernfalls tritt ein ERROR_INVALID_FLAGS
auf).
Hinweis
CP_ACP
entspricht CP_UTF8
nur bei Ausführung unter Windows Version 1903 (Update vom Mai 2019) oder höher und Festlegung der oben beschriebenen Eigenschaft ActiveCodePage auf UTF-8. Andernfalls wird die Codepage des Legacysystems berücksichtigt. Wir empfehlen die explizite Verwendung von CP_UTF8
.
Zugehörige Themen
Windows developer