撰寫、對應和排序 EUDC 和 PUA 字元
應用程式會使用 TextOut 和 ExtTextOut等輸出函式,將終端使用者定義字元寫入 (EUDC) 和私人使用區域 (PUA) 字元寫入螢幕或印表機。 如果啟用 EUDC,這些函式會自動從 EUDC 或 PUA 字元字型擷取字元資訊。 如需詳細資訊,請參閱 結束User_Defined和私人使用區域字元。
撰寫 EUDC 或 PUA 字元時,文字輸出函式的作業取決於目前選取的字型。 如果選取的字型是整合的 EUDC 或 PUA 字元字型,則函式會從該字型擷取字元資訊。 如果選取的字型是 雙位元組字元集 , (DBCS) 具有相關聯個別 EUDC 字型的 TrueType 字型,則函式會從指定的 EUDC 字型擷取資訊。 同樣地,如果選取的字型是具有相關聯個別 PUA 字元字型的 Unicode TrueType 字型,則函式會從 PUA 字元字型擷取資訊。 如果選取的字型沒有相關聯的 EUDC 或 PUA 字元字型,函式會從系統預設的 EUDC 字型擷取資訊。 如果字元不在系統預設的 EUDC 字型中,或沒有系統預設的 EUDC 字型,則函式會寫入所選字型所定義的預設字元。
應用程式可以使用 MultiByteToWideChar 和 WideCharToMultiByte 函式,將 EUDC 與 Unicode 對應至 Unicode。 MultiByteToWideChar 函式會將大部分 EUDC 對應至 Unicode PUA 中的字元。 不過,為了支援特定國家或地區標準,某些 EUDC 可以對應至非 PUA Unicode 代碼點。 WideCharToMultiByte函式會將 PUA 中的字元對應至其 EUDC 對應專案,如果這類對應存在,而且代碼點在 Unicode 中沒有有效的非 PUA 對應,則為 。 並非所有字碼頁都有 EUDC 範圍。 呼叫 WideCharToMultiByte 中指定的字碼頁必須包含 EUDC 代碼範圍,才能對應到要發生的 EUDC 範圍。 如果字碼頁不包含 EUDC 代碼範圍,函式會擷取 Unicode PUA 中任何字元的預設字元。
MultiByteToWideChar 和 WideCharToMultiByte 不保證往返對應。 換句話說,您可以從包含 EUDC 的特定多位元組字元串開始,將字串對應至 具有 MultiByteToWideChar 的 Unicode,並使用 WideCharToMultiByte將其對應回原始 DBCS,最後的結果與原始字串不同。 依賴將 EUDC 對應至 Unicode 的應用程式應該確保所有必要的字元可以在適當的字碼頁 EUDC 區域與 Unicode PUA 之間往返。
應用程式不應該嘗試將 EUDC 從一個字碼頁對應到另一個字碼頁。 如果應用程式從一個字碼頁從 EUDC 開始,將它對應至 具有 MultiByteToWideChar的 Unicode,並對應至具有 WideCharToMultiByte的不同 DBCS,則不會保證結果。 原始字元可能會對應至目的地字碼頁中的不同 EUDC,或可能對應為未定義的字元。 同樣地,將 Unicode 字串對應至具有 EUDC 範圍的字碼頁可能會有非預期的結果。 如果 Unicode 字串包含 PUA 字碼點,則代碼點可能會對應至不代表相同字元的 EUDC。
應用程式可以使用 CompareString 函式的 ANSI 版本來比較包含 EUDC 的 DBCS 字串。 函式可有效地將字元對應至 Unicode,然後再比較字元值。 應用程式可以使用 LCMapString 函式的 ANSI 版本和LCMAP_SORTKEY值,為字串建立排序索引鍵。 此函式會先有效地將字元對應至 Unicode。 PUA 中的所有字元都會在所有其他 Unicode 字元之後排序。 在區域內,字元會以數值順序排序。 如果應用程式嘗試使用 GetStringTypeA 函式擷取 EUDC 的 CTYPE 資訊,則函式會擷取每個字元的 Null 。
相關主題