Passa al contenuto principale

8. String and Character Issues (Problemi di stringhe e caratteri)

8.1. Character Encoding (Codifica dei caratteri)

Il testo JSON DEVE essere codificato in UTF-8, UTF-16 o UTF-32. La codifica predefinita è UTF-8, e il testo JSON codificato in UTF-8 è interoperabile poiché sarà letto con successo dal maggior numero di implementazioni; ci sono molte implementazioni che non possono leggere con successo testi in altre codifiche (come UTF-16 e UTF-32).

Le implementazioni NON DEVONO aggiungere un Byte Order Mark (BOM) all'inizio di un testo JSON. Per l'interoperabilità, le implementazioni che analizzano testo JSON POSSONO ignorare la presenza di un Byte Order Mark piuttosto che trattarlo come un errore.

8.2. Unicode Characters (Caratteri Unicode)

Quando tutte le stringhe rappresentate nel testo JSON sono interamente composte da caratteri Unicode [UNICODE] (indipendentemente da come sono escapati), quel testo JSON è interoperabile poiché tutte le implementazioni software che lo analizzano concorderanno sul contenuto dei nomi e dei valori di stringa negli oggetti e negli array.

Tuttavia, l'ABNF in questa specifica consente ai nomi dei membri e ai valori di stringa di contenere sequenze di bit che non possono codificare caratteri Unicode; ad esempio, "\uDEAD" (un singolo surrogato UTF-16 non accoppiato). Sono state osservate istanze di questa situazione, ad esempio, quando le librerie troncano stringhe UTF-16 senza verificare se la troncatura divide una coppia surrogata. Il comportamento del software che riceve testo JSON contenente tali valori è imprevedibile; ad esempio, le implementazioni possono restituire valori diversi per la lunghezza dei valori di stringa, o addirittura subire eccezioni di runtime fatali.

8.3. String Comparison (Confronto di stringhe)

Le implementazioni software spesso devono testare l'uguaglianza dei nomi dei membri degli oggetti. Le implementazioni che convertono la rappresentazione testuale in una sequenza di unità di codice Unicode, quindi eseguono un confronto numerico unità di codice per unità di codice, sono interoperabili poiché le implementazioni concorderanno in tutti i casi sull'uguaglianza o disuguaglianza di due stringhe. Ad esempio, le implementazioni che confrontano incondizionatamente stringhe escapate potrebbero scoprire erroneamente che "a\\b" e "a\u005Cb" non sono uguali.