Usare le tabelle codici UTF-8 nelle app di Windows

Usare la codifica dei caratteri UTF-8 per garantire una compatibilità ottimale tra le app Web e altre piattaforme basate su *nix (Unix, Linux e varianti), ridurre al minimo i bug di localizzazione e ridurre il sovraccarico di test.

UTF-8 è la tabella codici universale per l'internazionalizzazione ed è in grado di codificare l'intero set di caratteri Unicode. Viene usata in modo diffuso sul Web ed è l'impostazione predefinita per le piattaforme basate su *nix.

Impostare una tabella codici del processo su UTF-8

A partire dalla versione di Windows 1903 (aggiornamento maggio 2019), è possibile usare la proprietà ActiveCodePage in appxmanifest per le app in pacchetto o il manifesto fusion per le app non in pacchetto, per forzare un processo a usare UTF-8 come tabella codici del processo.

Nota

GDI non supporta attualmente l'impostazione della proprietà ActiveCodePage per processo. Per impostazione predefinita, invece, GDI utilizza la codepage del sistema attivo. Per configurare l'app per il rendering del testo UTF-8 tramite GDI, passare a Windows Impostazioni>Ora & lingua>Lingua & regione>Impostazioni della lingua amministrativa>Modifica locale sistema, quindi fare clic su Beta: Use Unicode UTF-8 for worldwide language support (Usare Unicode UTF-8 per il supporto di lingue internazionali). Quindi riavviare il PC per rendere effettiva la modifica.

È possibile comunicare la proprietà ActiveCodePage e la destinazione/esecuzione su build precedenti di Windows, ma bisogna gestire il rilevamento e la conversione della tabella codici legacy come di consueto. Con una versione di destinazione minima di Windows versione 1903, la tabella codici del processo sarà sempre UTF-8, quindi è possibile evitare il rilevamento e la conversione della tabella codici legacy.

Nota

Un carattere codificato richiede tra 1 e 4 byte. La codifica UTF-8 supporta sequenze di byte più lunghe, fino a 6 byte, ma il punto di codice più grande di Unicode 6.0 (U+10FFFF) richiede solo 4 byte.

Esempi

Manifesto Appx per un'app in pacchetto:

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

Manifesto Fusion per un'app Win32 non in pacchetto:

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

Nota

Aggiungere un manifesto a un eseguibile esistente dalla riga di comando con mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1.

-A e -W APIs

Le API Win32 supportano spesso varianti -A e -W.

-Le varianti riconoscono la tabella codici ANSI configurata nel sistema e supportano char*, mentre le varianti -W operano in UTF-16 e supportano WCHAR.

Fino a poco tempo fa, Windows evidenziava le varianti "Unicode" -W rispetto alle API -A. Tuttavia, le versioni recenti hanno usato la tabella codici ANSI e le API -A come mezzo per introdurre il supporto UTF-8 alle app. Se la tabella codici ANSI è configurata per UTF-8, le API -A funzionano in genere in UTF-8. Questo modello offre il vantaggio di supportare il codice esistente compilato con le API -A senza modifiche al codice.

Conversione delle tabelle codici

Poiché Windows opera in modo nativo in UTF-16 (WCHAR), potrebbe essere necessario convertire i dati UTF-8 in UTF-16 (o viceversa) per interagire con le API di Windows.

MultiByteToWideChar e WideCharToMultiByte consentono di eseguire la conversione tra UTF-8 e UTF-16 (WCHAR) (e altre tabelle codici). Ciò è particolarmente utile quando un'API Win32 legacy può comprendere solo WCHAR. Queste funzioni consentono di convertire l'input UTF-8 in WCHAR per passare in un'API -W e quindi convertire i risultati, se necessario.

Usare dwFlags di 0 o MB_ERR_INVALID_CHARS quando si utilizzano queste funzioni con CodePage impostato su CP_UTF8 (altrimenti si verifica ERROR_INVALID_FLAGS).

Nota

CP_ACP equivale a CP_UTF8 solo se è in esecuzione in Windows Versione 1903 (aggiornamento di maggio 2019) o versione successiva e la proprietà ActiveCodePage descritta in precedenza è impostata su UTF-8. In caso contrario, rispetta la tabella codici di sistema legacy. È consigliabile usare CP_UTF8 in modo esplicito.