Passa al contenuto principale

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.