8. String and Character Issues (Problemi di stringhe e caratteri)
8.1. Character Encoding (Codifica dei caratteri)
Il testo JSON scambiato tra sistemi che non fanno parte di un ecosistema chiuso deve (MUST) essere codificato utilizzando UTF-8 [RFC3629].
Le specifiche precedenti di JSON non hanno richiesto l'uso di UTF-8 durante la trasmissione di testo JSON. Tuttavia, la stragrande maggioranza delle implementazioni software basate su JSON ha scelto di utilizzare la codifica UTF-8, al punto che è l'unica codifica che raggiunge l'interoperabilità.
Le implementazioni non devono (MUST NOT) aggiungere un marcatore dell'ordine dei byte (Byte Order Mark, BOM, U+FEFF) all'inizio di un testo JSON trasmesso in rete. Nell'interesse dell'interoperabilità, le implementazioni che analizzano i testi JSON possono (MAY) ignorare la presenza di un marcatore dell'ordine dei byte piuttosto che trattarlo come un errore.
8.2. Unicode Characters (Caratteri Unicode)
Quando tutte le stringhe rappresentate in un testo JSON sono composte interamente da caratteri Unicode [UNICODE] (comunque escapati), allora quel testo JSON è interoperabile nel senso che tutte le implementazioni software che lo analizzano concorderanno sul contenuto dei nomi e dei valori stringa negli oggetti e negli array.
Tuttavia, l'ABNF in questa specifica consente ai nomi dei membri e ai valori stringa di contenere sequenze di bit che non possono codificare caratteri Unicode; ad esempio, "\uDEAD" (un singolo surrogato UTF-16 non accoppiato). Sono stati osservati casi di ciò, ad esempio, quando una libreria tronca una stringa UTF-16 senza verificare se il troncamento ha diviso una coppia surrogata. Il comportamento del software che riceve testi JSON contenenti tali valori è imprevedibile; ad esempio, le implementazioni potrebbero restituire valori diversi per la lunghezza di un valore stringa o persino soffrire di eccezioni di runtime fatali.
8.3. String Comparison (Confronto di stringhe)
Le implementazioni software sono tipicamente tenute a testare i nomi dei membri dell'oggetto per l'uguaglianza. Le implementazioni che trasformano la rappresentazione testuale in sequenze di unità di codice Unicode e quindi eseguono il confronto numericamente, unità di codice per unità di codice, sono interoperabili nel senso che le implementazioni concorderanno in tutti i casi sull'uguaglianza o sulla disuguaglianza di due stringhe. Ad esempio, le implementazioni che confrontano stringhe con caratteri escapati non convertiti possono trovare erroneamente che "a\\b" e "a\u005Cb" non sono uguali.