Menggunakan halaman kode UTF-8 di aplikasi Windows

Gunakan pengodean karakter UTF-8 untuk kompatibilitas optimal antara aplikasi web dan platform berbasis *nix lainnya (Unix, Linux, dan varian), meminimalkan bug pelokalan, dan mengurangi overhead pengujian.

UTF-8 adalah halaman kode universal untuk internasionalisasi dan mampu mengodekan seluruh set karakter Unicode. Ini digunakan secara pervasif di web, dan merupakan default untuk *platform berbasis nix.

Mengatur halaman kode proses ke UTF-8

Pada Windows Versi 1903 (Pembaruan Mei 2019), Anda dapat menggunakan properti ActiveCodePage di appxmanifest untuk aplikasi paket, atau manifes fusi untuk aplikasi yang tidak dikemas, untuk memaksa proses menggunakan UTF-8 sebagai halaman kode proses.

Catatan

GDI saat ini tidak mendukung pengaturan properti ActiveCodePage per proses. Sebagai gantinya, GDI default ke halaman kode sistem aktif. Untuk mengonfigurasi aplikasi Anda untuk merender teks UTF-8 melalui GDI, buka Pengaturan bahasa Windows Pengaturan> Time & bahasa>& bahasa>Administratif wilayah>Ubah lokal sistem, dan periksa Beta: Gunakan Unicode UTF-8 untuk dukungan bahasa di seluruh dunia. Kemudian mulai ulang PC agar perubahan diterapkan.

Anda dapat mendeklarasikan properti ActiveCodePage, dan menargetkan/menjalankan pada build Windows sebelumnya, tetapi Anda harus menangani deteksi halaman kode warisan dan konversi seperti biasa. Dengan versi target minimum Windows Versi 1903, halaman kode proses akan selalu UTF-8, sehingga deteksi dan konversi halaman kode warisan dapat dihindari.

Catatan

Karakter yang dikodekan membutuhkan waktu antara 1 dan 4 byte. Pengodean UTF-8 mendukung urutan byte yang lebih panjang, hingga 6 byte, tetapi titik kode terbesar Unicode 6.0 (U+10FFFF) hanya membutuhkan 4 byte.

Contoh

Manifes appx untuk aplikasi yang dikemas:

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

Manifes Fusion untuk aplikasi Win32 yang tidak dikemas:

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

Catatan

Tambahkan manifes ke executable yang ada dari baris perintah dengan mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1.

-A vs. -W API

API Win32 sering mendukung varian -A dan -W.

-Varian mengenali halaman kode ANSI yang dikonfigurasi pada sistem dan dukungan char*, sementara varian -W beroperasi di UTF-16 dan mendukung WCHAR.

Sampai saat ini, Windows telah menekankan "Unicode" -W varian melalui -A API. Namun, rilis terbaru telah menggunakan halaman kode ANSI dan API -A sebagai sarana untuk memperkenalkan dukungan UTF-8 ke aplikasi. Jika halaman kode ANSI dikonfigurasi untuk UTF-8, maka API -A biasanya beroperasi di UTF-8. Model ini memiliki manfaat mendukung kode yang ada yang dibangun dengan -A API tanpa perubahan kode apa pun.

Konversi halaman kode

Karena Windows beroperasi secara asli di UTF-16 (WCHAR), Anda mungkin perlu mengonversi data UTF-8 ke UTF-16 (atau sebaliknya) untuk beroperasi dengan API Windows.

MultiByteToWideChar dan WideCharToMultiByte memungkinkan Anda mengonversi antara UTF-8 dan UTF-16 () (WCHARdan halaman kode lainnya). Ini sangat berguna ketika API Win32 warisan mungkin hanya memahami WCHAR. Fungsi-fungsi ini memungkinkan Anda mengonversi input UTF-8 untuk WCHAR diteruskan ke API -W dan kemudian mengonversi hasil apa pun kembali jika perlu.

Penggunaan dwFlags baik 0 atau MB_ERR_INVALID_CHARS saat menggunakan fungsi-fungsi ini dengan CodePage diatur ke CP_UTF8 (jika tidak, ERROR_INVALID_FLAGS terjadi).

Catatan

CP_ACP sama dengan CP_UTF8 hanya jika berjalan pada Windows Versi 1903 (Pembaruan Mei 2019) atau lebih tinggi dan properti ActiveCodePage yang dijelaskan di atas diatur ke UTF-8. Jika tidak, ini menghormati halaman kode sistem warisan. Sebaiknya gunakan CP_UTF8 secara eksplisit.