Usare la tabella codici UTF-8Use the UTF-8 code page

Usare la codifica dei caratteri UTF-8 per la compatibilità ottimale tra app Web e altre * piattaforme basate su nix (UNIX, Linux e varianti), ridurre al minimo i bug di localizzazione e ridurre il sovraccarico dei test.Use UTF-8 character encoding for optimal compatibility between web apps and other *nix-based platforms (Unix, Linux, and variants), minimize localization bugs, and reduce testing overhead.

UTF-8 è la tabella codici universale per l'internazionalizzazione ed è in grado di codificare l'intero set di caratteri Unicode.UTF-8 is the universal code page for internationalization and is able to encode the entire Unicode character set. Viene utilizzata in un sito Web ed è l'impostazione predefinita per le piattaforme basate su nix.It is used pervasively on the web, and is the default for *nix-based platforms.

Nota

Un carattere codificato richiede da 1 a 4 byte.An encoded character takes between 1 and 4 bytes. 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.UTF-8 encoding supports longer byte sequences, up to 6 bytes, but the biggest code point of Unicode 6.0 (U+10FFFF) only takes 4 bytes.

-API vs.-W-A vs. -W APIs

Le API Win32 spesso supportano le varianti-A e-W.Win32 APIs often support both -A and -W variants.

-Le varianti riconoscono la tabella codici ANSI configurata nel sistema e supportano char* , mentre le varianti-W operano in UTF-16 e supportano WCHAR .-A variants recognize the ANSI code page configured on the system and support char*, while -W variants operate in UTF-16 and support WCHAR.

Fino a poco tempo fa, Windows ha enfatizzato le API "Unicode"-W Variants over-A.Until recently, Windows has emphasized "Unicode" -W variants over -A APIs. Tuttavia, le versioni recenti hanno usato la tabella codici ANSI e le API come mezzo per introdurre il supporto UTF-8 per le app.However, recent releases have used the ANSI code page and -A APIs as a means to introduce UTF-8 support to apps. Se la tabella codici ANSI è configurata per UTF-8, le API funzionano in UTF-8.If the ANSI code page is configured for UTF-8, -A APIs operate in UTF-8. Questo modello offre il vantaggio di supportare il codice esistente creato con le API-A senza apportare modifiche al codice.This model has the benefit of supporting existing code built with -A APIs without any code changes.

Impostare una tabella codici di processo su UTF-8Set a process code page to UTF-8

A partire da Windows versione 1903 (aggiornamento di 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 di processo.As of Windows Version 1903 (May 2019 Update), you can use the ActiveCodePage property in the appxmanifest for packaged apps, or the fusion manifest for unpackaged apps, to force a process to use UTF-8 as the process code page.

È possibile dichiarare questa proprietà e la destinazione/esecuzione nelle compilazioni precedenti di Windows, ma è necessario gestire il rilevamento e la conversione della tabella codici legacy come di consueto.You can declare this property and target/run on earlier Windows builds, but you must handle legacy code page detection and conversion as usual. Con una versione di destinazione minima di Windows versione 1903, la tabella codici di processo sarà sempre UTF-8, quindi è possibile evitare la conversione e il rilevamento della tabella codici legacy.With a minimum target version of Windows Version 1903, the process code page will always be UTF-8 so legacy code page detection and conversion can be avoided.

EsempiExamples

Manifesto appx per un'app in pacchetto:Appx manifest for a packaged app:

<?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:Fusion manifest for an unpackaged Win32 app:

<?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>;#1Add a manifest to an existing executable from the command line with mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1

Conversione della tabella codiciCode page conversion

Poiché Windows funziona 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.As Windows operates natively in UTF-16 (WCHAR), you might need to convert UTF-8 data to UTF-16 (or vice versa) to interoperate with Windows APIs.

MultiByteToWideChar e WideCharToMultiByte consentono di eseguire la conversione da UTF-8 a UTF-16 () e da WCHAR altre tabelle codici.MultiByteToWideChar and WideCharToMultiByte let you convert between UTF-8 and UTF-16 (WCHAR) (and other code pages). Questa operazione è particolarmente utile quando un'API Win32 legacy potrebbe solo comprendere WCHAR .This is particularly useful when a legacy Win32 API might only understand WCHAR. Queste funzioni consentono di convertire l'input UTF-8 in WCHAR per passare all'API a-W e quindi convertire i risultati se necessario.These functions allow you to convert UTF-8 input to WCHAR to pass into a -W API and then convert any results back if necessary. Quando si usano queste funzioni con CodePage impostato su CP_UTF8 , usare dwFlags 0 o MB_ERR_INVALID_CHARS . in caso contrario, ERROR_INVALID_FLAGS viene generato un oggetto.When using these functions with CodePage set to CP_UTF8, use dwFlags of either 0 or MB_ERR_INVALID_CHARS, otherwise an ERROR_INVALID_FLAGS occurs.

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.CP_ACP equates to CP_UTF8 only if running on Windows Version 1903 (May 2019 Update) or above and the ActiveCodePage property described above is set to UTF-8. In caso contrario, viene rispettata la tabella codici di sistema legacy.Otherwise, it honors the legacy system code page. Si consiglia di usare in CP_UTF8 modo esplicito.We recommend using CP_UTF8 explicitly.