Français

Outils de développement · JSON formateur et validateur

Caractères invisibles qui cassent JSON : BOM, guillemets intelligents et NBSP

· Comment ça marche

json flux de travail du développeur validation

Caractères invisibles qui cassent JSON : BOM, guillemets intelligents et NBSP illustrés avec des jetons JSON et une limite de validation précise
Illustration vectorielle originale de ToolAcre

Lorsque le validateur signale une erreur au tout premier caractère et que le fichier semble parfait, un caractère invisible est généralement à blâmer. Cet article explique les marques d'ordre des octets, les guillemets typographiques et les espaces insécables, ainsi que la manière dont chacun d'entre eux est signalé.

Ligne 1, colonne 1, rien d'anormal à voir

Ligne 1, colonne 1, rien d'anormal à voir — un document JSON peut commencer par un caractère qui occupe une position réelle mais s'affiche sans glyphe visible. L'accolade ouvrante apparaît alors comme la première même si une marque d'ordre d'octet ou un caractère de largeur nulle la précède. Un analyseur strict rencontre ce point de code caché avant qu'il n'atteigne `{`, donc le signalement de la première colonne est précis plutôt que vague. L'affichage et la séquence des personnages racontent simplement des histoires différentes.

Ne supprimez pas une accolade qui semble correcte simplement parce que le curseur apparaît à côté d'elle. Inspectez le point de code au niveau du décalage signalé, activez les espaces visibles ou passez à une vue hexadécimale. ToolAcre ne supprime pas silencieusement une nomenclature principale avant l'analyse, et son scanner signale le premier caractère inattendu.

La marque d'ordre d'octet UTF-8

La marque d'ordre d'octet UTF-8 — la séquence d'octets EF BB BF décode en U+FEFF au début d'un fichier. L'ordre des octets n'est pas ambigu dans UTF-8, la marque est donc inutile, mais certains éditeurs et outils d'exportation l'ajoutent toujours comme signature d'encodage. La RFC 8259 indique que les générateurs JSON ne doivent pas ajouter de nomenclature au JSON en réseau, bien que les analyseurs puissent choisir d'en ignorer une pour des raisons d'interopérabilité. Cette tolérance ne peut pas être supposée entre les outils.

Dans une chaîne JavaScript, la nomenclature comporte un caractère même si sa représentation UTF-8 utilise trois octets. ToolAcre signale les positions en caractères de chaîne, donc une marque de début apparaît à la ligne 1, colonne 1. Configurez l'éditeur pour enregistrer UTF-8 sans BOM ou supprimez U+FEFF avant de distribuer le fichier.

Citations intelligentes des traitements de texte

Citations intelligentes des traitements de texte : les marques typographiques d'ouverture et de fermeture semblent raffinées en prose, mais JSON ne reconnaît que le guillemet ASCII U+0022 comme délimiteur de chaîne. U+201C et U+201D sont des caractères Unicode ordinaires. En dehors d’une chaîne, ils ne peuvent pas commencer un nom ou une valeur de propriété, donc le validateur rapporte lui-même le guillemet intelligent. La correction automatique dans le chat, le courrier électronique ou un éditeur de document introduit souvent le changement après que le JSON était initialement valide.

Remplacez les délimiteurs par des guillemets droits, puis examinez les apostrophes et les guillemets qui appartiennent à la valeur. Les guillemets bouclés sont parfaitement légaux en tant que contenu à l'intérieur d'une chaîne JSON correctement délimitée, telle que `"She said “go”"` ; ils échouent seulement lorsqu’on leur demande d’effectuer le travail grammatical du délimiteur.

Espaces insécables et caractères de largeur nulle

Espaces insécables et caractères de largeur nulle — JSON les espaces sont une liste délibérément courte : espace ordinaire U+0020, tabulation U+0009, saut de ligne U+000A et retour chariot U+000D. Un espace insécable U+00A0 peut sembler identique à un espace normal entre deux points et une valeur, mais il ne figure pas sur cette liste. Un espace de largeur nulle U+200B ne montre rien du tout, mais il reste un caractère inattendu en dehors d'une chaîne entre guillemets.

Les pages Web utilisent des espaces insécables pour maintenir les mots ensemble, et les systèmes de messagerie peuvent insérer des caractères de largeur nulle pour le retour à la ligne ou la gestion des scripts. La copie d'extraits formatés peut les intégrer à la configuration. Remplacez les caractères structurels NBSP par des espaces ordinaires et supprimez les caractères de largeur nulle involontaires, guidés par le décalage signalé.

Exemple concret : une configuration copiée à partir d'un message de discussion

Exemple concret : une configuration copiée à partir d'un message de discussion – supposons que le texte visible ressemble à `{"mode": "safe"}`, mais que la validation échoue au début. Une vue hex révèle EF BB BF avant le corset. La suppression de cette nomenclature fait avancer le rapport suivant vers le devis précédant `mode`, qui est en fait U+201C. Le remplacement des deux délimiteurs intelligents par U+0022 expose alors un U+00A0 entre les deux points et la valeur.

Remplacez cet espace structurel insécable par U+0020 et validez une fois de plus. Le résultat accepté peut maintenant être formaté normalement. Cette séquence montre pourquoi réparer uniquement ce que l'écran semble montrer n'est pas fiable : plusieurs caractères invisibles ou ressemblants peuvent occuper des positions grammaticales différentes. Suivez chaque ligne et colonne, identifiez le point de code réel, effectuez un remplacement intentionnel et réexécutez la validation.

Comment voir l'invisible

Comment voir l'invisible : activez l'option de rendu des espaces d'un éditeur pour distinguer les tabulations des espaces et révéler les espaces inhabituels, puis utilisez un inspecteur Unicode ou une vue hexadécimale pour les caractères qui semblent toujours identiques. Une nomenclature UTF-8 apparaît sous la forme EF BB BF, un espace insécable sous la forme C2 A0 et un espace de largeur nulle sous la forme E2 80 8B. Les guillemets d'ouverture et de fermeture intelligents apparaissent sous la forme E2 80 9C et E2 80 9D.

Faites correspondre le système de coordonnées du diagnostic avant de compter. ToolAcre analyse une chaîne JavaScript, de sorte que ses colonnes comptent les unités de code UTF-16 plutôt que UTF-8 octets. Un éditeur hexadécimal orienté octet peut donc afficher un décalage numérique plus grand après les caractères non-ASCII. Utilisez la ligne signalée pour affiner la recherche, inspecter les points de code voisins et traduire uniquement si nécessaire.

Ce que cela ne couvre pas

Ce que cela ne couvre pas : un mojibake tel que `café` peut être complètement valide JSON. L'analyseur voit une séquence ordinaire de caractères de chaîne et n'a aucune preuve que UTF-8 octets ont été précédemment décodés comme un autre codage. De même, un espace insécable ou un caractère de largeur nulle à l’intérieur d’une valeur entre guillemets est syntaxiquement valide. La validation détecte les caractères qui violent la grammaire JSON ; il ne peut pas décider si un contenu Unicode valide correspond à l’intention de l’auteur.

Réparez la corruption de l'encodage à la limite où les octets deviennent du texte, en utilisant la connaissance des encodages d'origine et erronés. N'encodez et ne décodez pas à plusieurs reprises une chaîne JSON jusqu'à ce qu'elle soit meilleure, car cela pourrait endommager les caractères déjà corrects. La normalisation au niveau de l'application est également une décision distincte : des séquences Unicode visuellement identiques peuvent se comparer différemment tout en restant valides.

À retenir : faites confiance à la colonne signalée même lorsque la ligne semble propre

À retenir : faites confiance à la colonne signalée même lorsque la ligne semble propre : les caractères invisibles et les signes de ponctuation similaires occupent toujours des positions précises dans la source. Une nomenclature de début, un délimiteur bouclé, un espace insécable ou une marque de largeur nulle peuvent empêcher un analyseur d'atteindre l'accolade ou le guillemet qui semble correct. Révélez les espaces, inspectez les points de code ou les octets et remplacez le caractère dont l'identité entre en conflit avec son rôle grammatical plutôt que de modifier au hasard JSON visible à proximité.

N'oubliez pas que les positions peuvent compter les caractères alors qu'un outil hexadécimal compte les octets codés, alors comparez le texte environnant au lieu de vous attendre à ce que chaque nombre de décalage corresponde. Supprimez une nomenclature uniquement à la limite du document, convertissez les délimiteurs intelligents en U+0022 et remplacez l'espacement structurel non valide sans effacer les chaînes Unicode légitimes à l'intérieur.