Udostępnij za pośrednictwem


Korzystanie ze stron kodowych UTF-8 w aplikacjach systemu Windows

Użyj kodowania znaków UTF-8 , aby uzyskać optymalną zgodność między aplikacjami internetowymi i innymi platformami *opartymi na nix (Unix, Linux i wariantach), minimalizuj błędy lokalizacji i zmniejsz obciążenie związane z testowaniem.

UTF-8 to uniwersalna strona kodowa do międzynarodowych celów i umożliwia kodowanie całego zestawu znaków Unicode. Jest ona używana wszechobecnie w Internecie i jest domyślna dla *platform opartych na nix.

Ustaw stronę kodową procesu na UTF-8

Od wersji 1903 systemu Windows (aktualizacja z maja 2019 r.), można użyć właściwości ActiveCodePage w pliku appxmanifest dla spakowanych aplikacji lub manifestu łączenia dla aplikacji rozpakowanych, aby wymusić proces używania utF-8 jako strony kodu procesu.

Uwaga / Notatka

Interfejs GDI nie obsługuje obecnie ustawiania właściwości ActiveCodePage dla każdego procesu. Zamiast tego GDI domyślnie korzysta z aktywnej strony kodowej systemu. Aby skonfigurować aplikację do renderowania tekstu UTF-8 za pośrednictwem interfejsu GDI, przejdź do pozycji Ustawienia Windows Ustawienia>Czas i język>Język i region>Ustawienia administracyjne języka>Zmień ustawienia regionalne systemu i zaznacz Beta: Użyj Unicode UTF-8 do obsługi języków na całym świecie. Następnie uruchom ponownie komputer, aby zmiany zaczęły obowiązywać.

Można zadeklarować właściwość ActiveCodePage i uruchamiać na wcześniejszych kompilacjach systemu Windows, ale musisz obsługiwać stary sposób wykrywania i konwersji strony kodu. W przypadku minimalnej wersji docelowej Windows 1903, strona kodowa procesu zawsze będzie UTF-8, co pozwala uniknąć wykrywania i konwersji stron kodowych starszego typu.

Uwaga / Notatka

W formacie UTF-8 zakodowany znak jest reprezentowany przez sekwencję od 1 do 4 bajtów. (Zobacz definicję D92 w rozdziale 3 standardu Unicode dla specyfikacji formalnej).

Przykłady

Manifest appx dla spakowanej aplikacji:

<?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 fuzji dla nieopakowanej aplikacji 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>

Uwaga / Notatka

Dodaj manifest do istniejącego pliku wykonywalnego z wiersza polecenia za pomocą polecenia mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1.

-A kontra interfejsy API -W

Interfejsy API win32 często obsługują warianty -A i -W.

-Warianty -A rozpoznają stronę kodową ANSI skonfigurowaną w systemie i obsługują char*, podczas gdy warianty -W działają w formacie UTF-16 i obsługują WCHAR.

Do niedawna system Windows kładł nacisk na warianty -W Unicode w interfejsach API nad -A. Jednak ostatnie wersje używały strony kodu ANSI i interfejsów API -A jako środka do wprowadzenia obsługi utF-8 w aplikacjach. Jeśli strona kodowa ANSI jest skonfigurowana dla protokołu UTF-8, interfejsy API -A zwykle działają w formacie UTF-8. Ten model ma korzyść z obsługi istniejącego kodu utworzonego przy użyciu interfejsów API -A bez żadnych zmian kodu.

Konwersja strony kodowej

Ponieważ system Windows działa natywnie w formacie UTF-16 (WCHAR), może być konieczne przekonwertowanie danych UTF-8 na utF-16 (lub odwrotnie) w celu współdziałania z interfejsami API systemu Windows.

Funkcja MultiByteToWideChar i WideCharToMultiByte umożliwiają konwertowanie między formatami UTF-8 i UTF-16 () (WCHARi innymi stronami kodu). Jest to szczególnie przydatne, gdy starszy interfejs API Win32 może rozumieć tylko WCHAR. Te funkcje umożliwiają konwertowanie danych wejściowych UTF-8 do formatu odpowiedniego do użycia z interfejsem API -W, a następnie w razie potrzeby konwertowanie wyników z powrotem.

Użyj dwFlags spośród 0 lub MB_ERR_INVALID_CHARS podczas korzystania z tych funkcji, gdy CodePage jest ustawiony na CP_UTF8 (w przeciwnym razie wystąpi ERROR_INVALID_FLAGS).

Uwaga / Notatka

CP_ACP jest równa CP_UTF8 tylko jeśli działa na systemie Windows w wersji 1903 (Aktualizacja z maja 2019 r.) lub nowszej oraz właściwość ActiveCodePage opisana powyżej jest ustawiona na UTF-8. W przeciwnym razie honoruje starszą stronę kodową systemu. Zalecamy użycie CP_UTF8 jawnie.