Surrogati e caratteri supplementari

Le applicazioni Windows usano normalmente UTF-16 per rappresentare i dati dei caratteri Unicode . L'uso di 16 bit consente la rappresentazione diretta di 65.536 caratteri univoci, ma questo piano multilingue di base (BMP) non è quasi sufficiente per coprire tutti i simboli usati nelle lingue umane. Unicode versione 4.1 include oltre 97.000 caratteri, con oltre 70.000 caratteri solo per il cinese.

Lo standard Unicode ha stabilito 16 altri "piani" di caratteri, ognuna delle stesse dimensioni del BMP. Naturalmente, la maggior parte dei punti di codice oltre il BMP non dispone ancora di caratteri assegnati a loro, ma la definizione dei piani offre a Unicode il potenziale di definire 1.114.112 caratteri ,ovvero 216 * 17 caratteri) all'interno dell'intervallo di punti di codice U+0000 a U+10FFFF. Per UTF-16 per rappresentare questo set di caratteri più ampio, Lo standard Unicode definisce "caratteri supplementari".

Informazioni sui caratteri supplementari

Un carattere supplementare è un carattere che si trova oltre il BMP e un "surrogato" è un valore di codice UTF-16. Per UTF-16, è necessaria una "coppia surrogata" per rappresentare un singolo carattere supplementare. Il primo surrogato (alto) è un valore di codice a 16 bit nell'intervallo U+D800 a U+DBFF. Il secondo surrogato (basso) è un valore di codice a 16 bit nell'intervallo U+DC00 a U+DFFF. Usando il meccanismo surrogato, UTF-16 può supportare tutti i caratteri Unicode potenziali di 1.114.112. Per altre informazioni sui caratteri supplementari, i surrogati e le coppie surrogate, vedere Lo standard Unicode.

Nota

Windows 2000 introduce il supporto per l'input, l'output di base e l'ordinamento semplice di caratteri supplementari. Tuttavia, non tutti i componenti di sistema sono compatibili con caratteri supplementari.

 

Il sistema operativo supporta caratteri supplementari nei modi seguenti:

  • Formattare 12 della tabella cmap del tipo di carattere OpenType supporta direttamente il codice di caratteri a 4 byte. Per altre informazioni, vedere la specifica del tipo di carattere OpenType.
  • Windows supporta editor di metodi di input abilitati per surrogati (IMEs).
  • L'API GDI di Windows supporta il formato 12 tabelle cmap nei tipi di carattere in modo che i surrogati possano essere visualizzati correttamente.
  • L'API Uniscribe supporta caratteri supplementari.
  • I controlli Windows, inclusi Modifica e Modifica avanzata, supportano caratteri supplementari.
  • Il motore HTML supporta pagine HTML che includono caratteri supplementari per la visualizzazione, la modifica (tramite Outlook Express) e l'invio di moduli.
  • La tabella di ordinamento del sistema operativo supporta caratteri supplementari.

Linee guida generali per lo sviluppo software usando caratteri supplementari

UTF-16 gestisce i caratteri supplementari come coppie surrogate. Il sistema operativo elabora una coppia surrogata in modo analogo al modo in cui elabora contrassegni nonpacing. In fase di visualizzazione, la coppia surrogata viene visualizzata come un glifo tramite Uniscribe, come prescritto dallo Standard Unicode.

Windows Vista introduce tre nuove macro per identificare coppie surrogate e surrogati nelle stringhe UTF-16. Si tratta di IS_HIGH_SURROGATE, IS_LOW_SURROGATE e IS_SURROGATE_PAIR.

Le applicazioni supportano automaticamente caratteri supplementari se supportano Unicode e usano controlli di sistema e funzioni API standard, ad esempio ExtTextOut e DrawText. Pertanto, se l'applicazione usa controlli di sistema standard o usa chiamate generali extTextOut-type per visualizzare, i caratteri supplementari devono funzionare senza alcuna codifica speciale.

Le applicazioni che implementano il proprio supporto di modifica elaborando le posizioni del glifo in modo personalizzato possono usare Uniscribe per tutte le elaborazioni di testo. Uniscribe ha funzioni separate per gestire l'elaborazione di script complessi, ad esempio la visualizzazione del testo, il test di hit e lo spostamento del cursore. Un'applicazione deve chiamare le funzioni Uniscribe in modo specifico per ottenere queste funzionalità avanzate. Si noti che le applicazioni che usano le funzioni Uniscribe sono completamente multilingue, ma ciò impone una penalità delle prestazioni. Pertanto, alcune applicazioni devono eseguire il proprio trattamento dei caratteri supplementari.

Poiché il meccanismo surrogato per rappresentare i caratteri supplementari è ben definito, l'applicazione può includere il codice per gestire l'elaborazione del testo surrogato UTF-16. Quando l'applicazione rileva un valore UTF-16 separato dall'intervallo surrogato riservato inferiore (un surrogato basso) o dall'intervallo surrogato superiore riservato (un surrogato elevato), il valore deve essere una metà di una coppia surrogata. Pertanto, l'applicazione può rilevare una coppia surrogata eseguendo un semplice controllo dell'intervallo. Se rileva un valore UTF-16 nell'intervallo inferiore o superiore, deve tenere traccia di una larghezza a 16 bit o indietro per ottenere il resto del carattere. Quando si scrive l'applicazione, tenere presente che CharNext e CharPrev si spostano da punti di codice a 16 bit, non da coppie surrogate.

Nota

I punti di codice surrogati autonomi hanno un surrogato elevato senza un surrogato adiacente o viceversa. Questi punti di codice non sono validi e non sono supportati. Il loro comportamento non è definito.

 

Se si sviluppa un tipo di carattere o un provider IME, si noti che i sistemi operativi pre-Windows XP disabilitano il supporto dei caratteri supplementari per impostazione predefinita. Windows XP e versioni successive abilitano i caratteri supplementari per impostazione predefinita. Se si specifica un pacchetto IME e tipo di carattere che richiede caratteri supplementari, l'applicazione deve impostare i valori del Registro di sistema seguenti:

[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]

Character Sets