Aller au contenu principal

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 échangé entre des systèmes qui ne font pas partie d'un écosystème fermé doit (MUST) être encodé en UTF-8 [RFC3629].

Les spécifications précédentes de JSON n'ont pas exigé l'utilisation d'UTF-8 lors de la transmission de texte JSON. Cependant, la grande majorité des implémentations logicielles basées sur JSON ont choisi d'utiliser l'encodage UTF-8, à tel point que c'est le seul encodage qui permet l'interopérabilité.

Les implémentations ne doivent pas (MUST NOT) ajouter de marque d'ordre des octets (Byte Order Mark, BOM, U+FEFF) au début d'un texte JSON transmis sur le réseau. Dans l'intérêt de l'interopérabilité, les implémentations qui analysent les textes JSON peuvent (MAY) ignorer la présence d'une marque d'ordre des 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 un texte JSON sont composées entièrement de caractères Unicode [UNICODE] (quelle que soit la manière dont ils sont échappés), alors ce texte JSON est interopérable dans le sens où 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 substitut UTF-16 unique non apparié). Des instances de ceci ont été observées, par exemple, lorsqu'une bibliothèque tronque une chaîne UTF-16 sans vérifier si la troncature a divisé une paire de substitution. Le comportement du logiciel qui reçoit des textes JSON contenant de telles valeurs est imprévisible ; par exemple, les implémentations peuvent retourner des valeurs différentes pour la longueur d'une valeur de chaîne ou même subir des exceptions d'exécution fatales.

8.3. String Comparison (Comparaison de chaînes)

Les implémentations logicielles sont généralement tenues de tester l'égalité des noms des membres d'objet. Les implémentations qui transforment la représentation textuelle en séquences d'unités de code Unicode puis effectuent la comparaison numériquement, unité de code par unité de code, sont interopérables dans le sens où 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 des chaînes avec des caractères échappés non convertis peuvent trouver incorrectement que "a\\b" et "a\u005Cb" ne sont pas égaux.