在 Windows 應用程式中使用 UTF-8 字碼頁

使用 UTF-8 字元編碼來達到 Web 應用程式與其他 *nix 平臺之間的最佳相容性, (Unix、Linux 和變體) 、將當地語系化 Bug 降至最低,以及降低測試額外負荷。

UTF-8 是國際化的通用字碼頁,而且能夠編碼整個 Unicode 字元集。 它會在網路上經常使用,而且是 *nix 型平臺的預設值。

將進程字碼頁設定為 UTF-8

自 Windows 1903 版 (2019 年 5 月更新) 起,您可以使用 appxmanifest 中的 ActiveCodePage 屬性,或未封裝應用程式的融合資訊清單,強制進程使用 UTF-8 做為進程字碼頁。

您可以在先前的Windows組建上宣告此屬性和目標/執行,但您必須如往常一樣處理舊版字碼頁偵測和轉換。 使用最低目標版本 1903 Windows,程式字碼頁一律會是 UTF-8,因此可以避免舊版字碼頁偵測和轉換。

注意

編碼的字元會採用介於 1 到 4 個位元組之間。 UTF-8 編碼支援較長的位元組序列,最多 6 個位元組,但 Unicode 6.0 的最大字碼點 (U+10FFFF) 只需要 4 個位元組。

範例

已封裝應用程式的 Appx 資訊清單:

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

未封裝 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>

注意

從命令列將資訊清單新增至現有的可執行檔 mt.exe -manifest <MANIFEST> -outputresource:<EXE>;#1

-A 與 -W API

WIN32 API 通常同時支援 -A 和 -W 變體。

-A variant 可辨識系統上設定的 ANSI 字碼頁, char* 而 -W 變體在 UTF-16 中運作並支援 WCHAR

直到最近,Windows在 -A API 上強調 「Unicode」 -W 變體。 不過,最新版本已使用 ANSI 字碼頁和 -A API 作為對應用程式引進 UTF-8 支援的方法。 如果 ANSI 字碼頁已設定為 UTF-8,-A API 通常會在 UTF-8 中運作。 此模型的優點是支援使用 -A API 建置的現有程式碼,而不需要變更任何程式碼。

字碼頁轉換

Windows以原生方式在 UTF-16 () WCHAR 中運作時,您可能需要將 UTF-8 資料轉換成 UTF-16 (,反之亦然,) 才能與Windows API 交互操作。

MultiByteToWideCharWideCharToMultiByte 可讓您轉換 UTF-8 和 UTF-16 () (WCHAR 和其他字碼頁) 。 當舊版 WIN32 API 可能只瞭解 WCHAR 時,這特別有用。 這些函式可讓您將 UTF-8 輸入 WCHAR 轉換成 傳入 -W API,然後視需要轉換任何結果。 當使用這些函式設定為 CodePageCP_UTF8 時,請使用 dwFlags0MB_ERR_INVALID_CHARS ,否則 ERROR_INVALID_FLAGS 會發生 。

注意

CP_ACPCP_UTF8只有在 Windows 1903 版 (2019 年 5 月更新) 或更新版本上執行,且上述 ActiveCodePage 屬性設定為 UTF-8 時,才等於 。 否則,它會接受舊版系統字碼頁。 建議您明確使用 CP_UTF8