2015-08-22 19 views
5

A volte durante l'inizializzazione di un UnicodeScalar con un valore come 57292 produce il seguente errore:errore fatale: punti di codice ad alta e bassa surrogate sono valori non validi Unicode scalare

fatal error: high- and low-surrogate code points are not valid Unicode scalar values 

Che cosa è questo errore, perché lo fa si verificano e come posso prevenirlo in futuro?

+0

Si prega di mostrare un po 'di codice. – ruakh

+0

@ruakh: fatto. Aggiunto valore di esempio. –

risposta

7

Sfondo: UTF-16 rappresenta una sequenza di caratteri Unicode ("code point") come una sequenza di "unità di codice" a 16 bit. Per i caratteri i cui valori scalari si adattano entro 16 bit (vale a dire quelli da U + 0000 a U + FFFF), l'unità di codice ha lo stesso valore del carattere; ma per i caratteri esterni all'intervallo (quelli da U + 10000 a U + 10FFFF), UTF-16 deve utilizzare due unità di codice. Per farlo funzionare, Unicode riserva un intervallo di punti codice (da U + D800 a U + DFFF) come "sostituti", che non possono essere utilizzati come caratteri; UTF-16 può quindi utilizzare due di questi surrogati insieme per rappresentare un punto di codice al di fuori dell'intervallo di 16 bit. ("Alto" e "basso" si riferiscono a surrogati che servono come unità prima e secondo unità di codice in queste coppie, Ciascuno surrogato è un surrogato elevato o un surrogato basso, ma non entrambi, esperienza con gli anziani i set di caratteri hanno mostrato che è molto utile sapere sempre dove finisce un personaggio e inizia il successivo.)

Quindi il problema che stai vedendo è che stai cercando di creare un UnicodeScalar con un valore (U + DFCC) che, secondo lo standard Unicode, è riservato a non essere un scalare Unicode. U + DFCC è definito per non esistere ed è solo un "surrogato" per metà di uno scalare che esiste.

Per evitare questo problema, è necessario attenersi agli scalari che esistono — da U + 0000 a U + D7FF e da U + E000 a U + 10FFFF.

+0

Risposta perfetta. Grazie. :-) – fumoboy007

+1

In realtà, l'intervallo di surrogati è da U + D800 a U + DFFF, giusto? – fumoboy007

+1

@ fumoboy007: Whoops, giusto! Risolto adesso, grazie! – ruakh