Sdílet prostřednictvím


Použití znakových stránek UTF-8 v aplikacích pro Windows

Kódování znaků 8bitového formátu UTF-8 (Unicode Transformation Format) umožňuje maximalizovat kompatibilitu mezi webovými aplikacemi a dalšími platformami založenými na nix (Unix, Linux a varianty), minimalizovat chyby lokalizace a snížit režijní náklady na testování.

UTF-8 je univerzální znaková stránka pro internacionalizaci a dokáže zakódovat celou znakovou sadu Unicode. Používá se široce na webu a je výchozím kódováním pro platformy založené na JAZYCE XML i *nix.

Nastavit znakovou stránku procesu na UTF-8

Od verze Windows 1903 (aktualizace z května 2019) můžete zadat vlastnost activeCodePage v appxmanifestu pro zabalené aplikace (nebo fúzní manifest pro rozbalené aplikace) k vynucení procesu použití UTF-8 jako znakové stránky procesu.

Poznámka:

Rozhraní grafického zařízení systému Windows (GDI) v současné době nepodporuje nastavení vlastnosti activeCodePage na proces. Místo toho se GDI ve výchozím nastavení nastaví na aktivní systémovou znakovou stránku. Pokud chcete aplikaci nakonfigurovat tak, aby vykreslovala text UTF-8 prostřednictvím rozhraní GDI, přejděte do části Nastavení>Čas a jazyk>Jazyk a oblast>nastavení správce jazyků>Změnit systémové národní prostředí a zaškrtněte Beta: Použít Unicode UTF-8 pro podporu jazyků po celém světě. Potom restartujte počítač, aby se změna projevila.

Můžete deklarovat vlastnost activeCodePage a cílit a spustit na dřívějších buildech Windows, ale musíte zpracovat detekci a převod starší verze kódové stránky tak jako obvykle. S minimální cílovou verzí Systému Windows verze 1903 bude znaková stránka procesu vždy UTF-8, takže se můžete vyhnout detekci a převodu starší verze znakové stránky.

Poznámka:

V UTF-8 je kódovaný znak reprezentován posloupností 1 až 4 bajty. (Viz definice D92 v kapitole 3standardu Unicode pro formální specifikaci.)

Příklady

Manifest Appx pro zabalenou aplikaci:

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

manifest fúzní pro rozbalenou aplikaci Win32:

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

Poznámka:

Přidejte manifest do existujícího spustitelného souboru z příkazového řádku pomocí mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1příkazu .

-A vs. rozhraní API -W

Rozhraní API Win32 často podporují jak variantu -A, tak i variantu -W.

-A varianty rozpoznávají znakovou stránku ANSI nakonfigurovanou v systému a podporují char*, zatímco -W varianty fungují v UTF-16 a podporují WCHAR.

Až donedávna systém Windows upřednostňoval varianty Unicode -W před rozhraními -A API. Nedávné verze však jako prostředek k zavedení podpory UTF-8 pro aplikace používaly znakovou stránku ANSI a -A rozhraní API. Pokud je znaková stránka ANSI nakonfigurovaná pro UTF-8, -A rozhraní API obvykle fungují v UTF-8. Tento model má výhodu podpory existujícího kódu vytvořeného pomocí rozhraní API -A bez jakýchkoli změn kódu.

Převod kódové stránky

Vzhledem k tomu, že Systém Windows pracuje nativně v UTF-16 (WCHAR), možná budete muset převést data UTF-8 na UTF-16 (nebo naopak), aby bylo možné interoperativně s rozhraními API systému Windows.

MultiByteToWideChar a WideCharToMultiByte umožňují převod mezi UTF-8 a UTF-16 (WCHAR) (a dalšími znakovými stránkami). To je zvlášť užitečné, když starší rozhraní API Win32 může rozumět pouze WCHAR. Tyto funkce umožňují převést vstup UTF-8, aby bylo možné WCHAR předat do rozhraní API -W, a v případě potřeby převést všechny výsledky zpět.

Použijte dwFlags u buď 0 nebo MB_ERR_INVALID_CHARS při použití těchto funkcí s CodePage nastaveným na CP_UTF8 (jinak dojde k ERROR_INVALID_FLAGS).

Poznámka:

CP_ACP CP_UTF8 se rovná pouze v případě, že běží ve Windows verze 1903 (květen 2019 Update) nebo vyšší a vlastnost activeCodePage popsaná výše je nastavena na UTF-8. Jinak respektuje starší systémovou kódovou stránku. Doporučujeme použít CP_UTF8 explicitně.