Aracılığıyla paylaş


Windows uygulamalarında UTF-8 kod sayfalarını kullanma

Web uygulamaları ve diğer *nix tabanlı platformlar (Unix, Linux ve varyantlar) arasındaki uyumluluğu en üst düzeye çıkarmak, yerelleştirme hatalarını en aza indirmek ve test yükünü azaltmak için Unicode Dönüşüm Biçimi 8 bit (UTF-8) karakter kodlamasını kullanın.

UTF-8, uluslararasılaştırmaya yönelik evrensel kod sayfasıdır ve Unicode karakter kümesinin tamamını kodlar. Web üzerinde yaygın olarak kullanılır ve hem XML hem de *nix tabanlı platformlar için varsayılan kodlamadır.

İşlem kodu sayfasını UTF-8 olarak ayarlama

Windows Sürüm 1903 (Mayıs 2019 Güncelleştirmesi) itibarıyla, bir işlemi işlem kodu sayfası olarak UTF-8 kullanmaya zorlamak üzere paketlenmiş uygulamalar (veya paketlenmemiş uygulamalar için füzyon bildirimi) için appxmanifest'te activeCodePage özelliğini belirtebilirsiniz.

Uyarı

Windows grafik cihaz arabirimi (GDI) şu anda işlem başına activeCodePage özelliğini ayarlamayı desteklememektedir. Bunun yerine, GDI varsayılan olarak etkin sistem kod sayfasını kullanır. Uygulamanızı GDI aracılığıyla UTF-8 metnini işecek şekilde yapılandırmak için Windows Ayarları>Saat ve dil>Dili & bölge>Yönetim dili ayarları> değiştir'e gidin ve Beta: Dünya çapında dil desteği için Unicode UTF-8 kullanma seçeneğini işaretleyin. Ardından değişikliğin etkili olması için bilgisayarı yeniden başlatın.

activeCodePage özelliğini bildirebilir ve önceki Windows derlemelerinde hedef/çalıştırma yapabilirsiniz, ancak eski kod sayfası algılama ve dönüştürme işlemlerini her zamanki gibi işlemeniz gerekir. Windows Sürüm 1903'ün en düşük hedef sürümüyle, işlem kodu sayfası her zaman UTF-8 olacaktır, bu nedenle eski kod sayfası algılama ve dönüştürme önlenebilir.

Uyarı

UTF-8'de, kodlanmış bir karakter 1 ile 4 baytlık bir diziyle temsil edilir. (Resmi belirtim için unicode standardının3. bölümünde yer alan D92 tanımına bakın.)

Örnekler

Paketlenmiş bir uygulama için Appx bildirimi:

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

Paketlenmemiş win32 uygulaması için fusion bildirimi:

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

Uyarı

ile mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1komut satırından mevcut yürütülebilir dosyaya bir bildirim ekleyin.

-A ve -W API'leri karşılaştırması

Win32 API'leri genellikle hem -A hem de -W değişkenlerini destekler.

-Bir değişkene bağlı olarak, sistemde yapılandırılan ANSI kod sayfası tanınır ve char* desteklenir; -W değişkenleri ise UTF-16'da çalışır ve WCHAR destekler.

Yakın zamana kadar Windows, -A API'ler üzerinde "Unicode" -W değişkenlerini vurgulamıştır. Ancak son sürümlerde uygulamalara UTF-8 desteği sağlamak için ANSI kod sayfası ve -A API'leri kullanılmıştır. ANSI kod sayfası UTF-8 için yapılandırılmışsa, -A API'ler genellikle UTF-8'de çalışır. Bu model, kod değişikliği olmadan -A API'leri ile oluşturulmuş mevcut kodu destekleme avantajına sahiptir.

Kod sayfası dönüştürme

Windows UTF-16'da yerel olarak çalıştığından (WCHAR ), Windows API'leriyle birlikte çalışmak için UTF-8 verilerini UTF-16'ya (veya tam tersi) dönüştürmeniz gerekebilir.

MultiByteToWideChar ve WideCharToMultiByte, UTF-8 ile UTF-16 () (WCHARve diğer kod sayfaları) arasında dönüştürmenizi sağlar. Bu, özellikle eski bir Win32 API'si yalnızca WCHAR'ı anlayabildiğinde faydalıdır. Bu işlevler UTF-8 girişini bir -W API'sine geçirmek için WCHAR dönüştürmenize ve gerekirse sonuçları geri dönüştürmenize olanak sağlar.

Bu işlevleri dwFlags olarak ayarlanmış 0 ile kullanırken MB_ERR_INVALID_CHARS veya CodePageCP_UTF8 kullanın (aksi takdirde bir ERROR_INVALID_FLAGS oluşur).

Uyarı

CP_ACP yalnızca Windows Sürüm 1903 (Mayıs 2019 Güncelleştirmesi) veya üzerinde çalıştırılıyorsa ve yukarıda açıklanan activeCodePage özelliği UTF-8 olarak ayarlandıysa ile eşitlenebilir CP_UTF8 . Aksi takdirde, eski sistem kod sayfasını korur. Açıkça kullanmanızı CP_UTF8 öneririz.