Freigeben über


Verwenden von UTF-8-Codepages in Windows-Apps

Verwenden Sie UTF-8-Zeichencodierung zur optimalen Kompatibilität zwischen Web-Apps und anderen *nix-basierten Plattformen (Unix, Linux und Varianten), minimieren Sie Lokalisierungsfehler und reduzieren Sie den Testaufwand.

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. Um Ihre App so zu konfigurieren, dass UTF-8-Text über GDI gerendert wird, wechseln Sie zu den Einstellungen> für Zeit und Sprache>Region>Administrative Spracheinstellungen>Systemgebietsschema ändern, und aktivieren Sie die Option Beta: Unicode UTF-8 verwenden für globale Sprachunterstützung. 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 des Unicode-Standards für die formale Spezifikation.)

Beispiele

Appx-Manifest für eine verpackte 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>

Fusion-Manifest für eine entpackte 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).

Mit MultiByteToWideChar und WideCharToMultiByte können Sie zwischen UTF-8 und UTF-16 () (WCHARund anderen Codeseiten) konvertieren. 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.