Condividi tramite


Surrogati e caratteri supplementari

Le applicazioni Windows usano in genere UTF-16 per rappresentare dati di tipo carattere Unicode. L'uso di 16 bit consente una 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. La versione Unicode 4.1 include oltre 97.000 caratteri, con oltre 70.000 caratteri per il cinese.

Lo standard Unicode ha stabilito 16 "piani" aggiuntivi 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, ma la definizione dei piani offre a Unicode il potenziale di definire 1.114.112 caratteri (ovvero 216 * 17 caratteri) nell'intervallo di punti di codice U+0000 a U+10FFFF. Affinché UTF-16 rappresenti 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 di surrogati" per rappresentare un singolo carattere supplementare. Il primo surrogato (alto) è un valore di codice a 16 bit nell'intervallo da U+D800 a U+DBFF. Il secondo surrogato (basso) è un valore di codice a 16 bit nell'intervallo da U+DC00 a U+DFFF. Usando il meccanismo surrogato, UTF-16 può supportare tutti i 1.114.112 caratteri Unicode potenziali. Per altre informazioni sui caratteri supplementari, i surrogati e le coppie di surrogati, vedere Standard Unicode.

Nota

Windows 2000 introduce il supporto per l'input, l'output 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:

  • Il formato 12 della tabella cmap tipo di carattere OpenType supporta direttamente il codice carattere a 4 byte. Per altre informazioni, vedere la specifica del tipo di carattere OpenType .
  • Windows supporta gli 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.
  • controlli Di Windows, inclusi Modifica e Rich Edit, 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 di software con caratteri supplementari

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

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

Le applicazioni supportano automaticamente i 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 ExtTextOutchiamate di tipo da visualizzare, i caratteri supplementari devono funzionare senza scrivere codice speciale.

Le applicazioni che implementano il proprio supporto per la modifica lavorando su posizioni glifi in modo personalizzato possono usare Uniscribe per tutta l'elaborazione del testo. Uniscribe dispone di funzioni separate per gestire l'elaborazione di script complessi, ad esempio la visualizzazione del testo, l'hit testing 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ò comporta una riduzione delle prestazioni. Pertanto, alcune applicazioni devono eseguire la propria elaborazione di caratteri supplementari.

Poiché il meccanismo surrogato per rappresentare i caratteri supplementari è ben definito, l'applicazione può includere 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 (surrogato alto), il valore deve essere una metà di una coppia surrogata. Pertanto, l'applicazione può rilevare una coppia di surrogati eseguendo un semplice controllo dell'intervallo. Se rileva un valore UTF-16 nell'intervallo inferiore o superiore, deve tenere traccia indietro o avanti di una larghezza a 16 bit per ottenere il resto del carattere. Quando si scrive l'applicazione, tenere presente che CharNext e CharPrev spostare per punti di codice a 16 bit, non per coppie di surrogati.

Nota

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

 

Se stai sviluppando un tipo di carattere o un provider IME, tieni presente 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 tipo di carattere e un pacchetto IME 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]

set di caratteri