8. String and Character Issues (Problèmes de chaînes et de caractères)
8.1. Character Encoding (Encodage des caractères)
Le texte JSON DOIT être encodé en UTF-8, UTF-16 ou UTF-32. L'encodage par défaut est UTF-8, et le texte JSON encodé en UTF-8 est interopérable car il sera lu avec succès par le plus grand nombre d'implémentations; il existe de nombreuses implémentations qui ne peuvent pas lire avec succès les textes dans d'autres encodages (tels que UTF-16 et UTF-32).
Les implémentations NE DOIVENT PAS ajouter une marque d'ordre d'octets (BOM) au début d'un texte JSON. Pour l'interopérabilité, les implémentations qui analysent du texte JSON PEUVENT ignorer la présence d'une marque d'ordre d'octets plutôt que de la traiter comme une erreur.
8.2. Unicode Characters (Caractères Unicode)
Lorsque toutes les chaînes représentées dans le texte JSON sont entièrement composées de caractères Unicode [UNICODE] (quelle que soit la manière dont ils sont échappés), ce texte JSON est interopérable car toutes les implémentations logicielles qui l'analysent s'accorderont sur le contenu des noms et des valeurs de chaînes dans les objets et les tableaux.
Cependant, l'ABNF dans cette spécification permet aux noms de membres et aux valeurs de chaînes de contenir des séquences de bits qui ne peuvent pas encoder de caractères Unicode; par exemple, "\uDEAD" (un seul substitut UTF-16 non apparié). Des instances de cette situation ont été observées, par exemple, lorsque des bibliothèques tronquent des chaînes UTF-16 sans vérifier si la troncature divise une paire de substituts. Le comportement du logiciel qui reçoit du texte JSON contenant de telles valeurs est imprévisible; par exemple, les implémentations peuvent renvoyer des valeurs différentes pour la longueur des valeurs de chaînes, voire subir des exceptions d'exécution fatales.
8.3. String Comparison (Comparaison de chaînes)
Les implémentations logicielles doivent souvent tester l'égalité des noms de membres d'objets. Les implémentations qui convertissent la représentation textuelle en une séquence d'unités de code Unicode, puis effectuent une comparaison numérique unité de code par unité de code, sont interopérables car les implémentations s'accorderont dans tous les cas sur l'égalité ou l'inégalité de deux chaînes. Par exemple, les implémentations qui comparent inconditionnellement des chaînes échappées pourraient découvrir à tort que "a\\b" et "a\u005Cb" ne sont pas égales.