代理和補充字元

Windows 應用程式通常會使用 UTF-16 來代表 Unicode 字元資料。 使用 16 位可讓您直接表示 65,536 個唯一字元,但這個基本多語系平面 (BMP) 不足以涵蓋人類語言所使用的所有符號。 Unicode 4.1 版包含超過 97,000 個字元,中文則超過 70,000 個字元。

Unicode 標準已建立 16 個額外的「平面」字元,每個字元的大小都與 BMP 相同。 當然,BMP 以外的大部分字碼點尚未指派字元,但平面的定義可讓 Unicode 定義 1,114,112 個字元, (也就是,216 * 17 個字元) 代碼點範圍 U+0000 到 U+10FFFF。 若要讓 UTF-16 代表這個較大的字元集,Unicode 標準會定義「增補字元」。

關於增補字元

增補字元是位在 BMP 以外的字元,而 「surrogate」 則是 UTF-16 字碼值。 對於 UTF-16,必須有「surrogate 字組」,才能代表單一增補字元。 第一個 (高) Surrogate 是 U+D800 到 U+DBFF 範圍內的 16 位程式碼值。 第二個 (低) Surrogate 是 U+DC00 到 U+DFFF 範圍內的 16 位程式碼值。 使用 Surrogate 機制,UTF-16 可以支援所有 1,114,112 個可能的 Unicode 字元。 如需增補字元、代理和代理字組的詳細資訊,請參閱 Unicode 標準

注意

Windows 2000 引進基本輸入、輸出和簡單增補字元排序的支援。 不過,並非所有系統元件都與增補字元相容。

 

作業系統以下列方式支援增補字元:

  • OpenType 字型 cmap 表格的格式 12 直接支援 4 位元組字元碼。 如需詳細資訊,請參閱 OpenType 字型規格
  • Windows 支援啟用代理的 輸入法編輯器, (IME)
  • Windows GDI API 支援字型中的格式 12 cmap 表格,以便正確顯示代理。
  • Uniscribe API 支援增補字元。
  • Windows 控制項,包括 [編輯 ] 和 [ 豐富編輯],都支援增補字元。
  • HTML 引擎支援 HTML 頁面,其中包含用於顯示的增補字元、透過 Outlook Express) 編輯 (,以及表單提交。
  • 作業系統排序資料表支援增補字元。

使用增補字元進行軟體發展的一般指導方針

UTF-16 會將增補字元當作代理字組來處理。 作業系統處理 Surrogate 配對的方式類似于處理 非步調標記的方式。 在顯示時,Surrogate 字組會以 Uniscribe 的方式顯示為一個字元,如 Unicode 標準所規定。

Windows Vista 引進三個新的宏,以協助識別 UTF-16 字串中的 Surrogate 和 Surrogate 配對。 這些是 IS_HIGH_SURROGATEIS_LOW_SURROGATEIS_SURROGATE_PAIR

如果應用程式支援 Unicode 並使用系統控制項和標準 API 函式,例如 ExtTextOutDrawText,應用程式會自動支援增補字元。 因此,如果您的應用程式使用標準系統控制項或使用一般 ExtTextOut類型呼叫來顯示,補充字元應該可以運作,而不需要任何特殊編碼。

藉由以自訂方式處理圖像位置,實作自己的編輯支援的應用程式可以使用 Uniscribe 來處理所有文字處理。 Uniscribe 有個別的函式來處理複雜的腳本處理,例如文字顯示、點擊測試和游標移動。 應用程式必須特別呼叫 Uniscribe 函式,才能取得這些進階功能。 請注意,使用 Uniscribe 函式的應用程式是完全多語系,但這會產生效能負面影響。 因此,某些應用程式應該自行處理增補字元。

由於代表增補字元的 Surrogate 機制已妥善定義,因此您的應用程式可以包含程式碼來處理 UTF-16 代理文字處理。 當應用程式遇到與較低的保留 Surrogate 範圍 (低 surrogate) 或高 Surrogate 範圍 (高 Surrogate) (分隔的 UTF-16 值時,此值必須是代理字組的一半。 因此,應用程式可以透過執行簡單的範圍檢查來偵測 Surrogate 配對。 如果它遇到下限或上層範圍內的 UTF-16 值,則必須向後或向前追蹤一個 16 位的寬度,才能取得其餘字元。 撰寫應用程式時,請記住 CharNextCharPrev 會依 16 位字碼點移動,而不是代理字組。

注意

獨立 Surrogate 字碼指標具有高 Surrogate,但沒有相鄰低 Surrogate,反之亦然。 這些字碼指標無效,不支援。 其行為未定義。

 

如果您要開發字型或 IME 提供者,請注意 Windows XP 作業系統預設會停用增補字元支援。 Windows XP 和更新版本預設會啟用增補字元。 如果您提供需要增補字元的字型和輸入法套件,您的應用程式必須設定下列登錄值:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack]
SURROGATE=(REG_DWORD)0x00000002

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\42]
IEFixedFontName=[Surrogate Font Face Name]
IEPropFontName=[Surrogate Font Face Name]

字元集