Інструменти розробника · JSON форматування & реаніматор
Невидимі символи, які зламаються JSON: BOM, смарт-ролики та NBSP
· Як працює
Опубліковано ToolAcre · Редакція журналу
свінгери розробник-workflow введення

Коли реактиватор повідомляє про помилку в першому символіці і файл виглядає ідеально, невидимий характер зазвичай полум'я. Цей пост пояснюється знаками порядку, типографічними лапками та нерозривними просторами, і як про це повідомляється кожен.
Лінія 1, стовпчик 1, нічого неправда, щоб побачити
Лінія 1, стовпчик 1, нічого невірно бачити — JSON документ може початися з символу, який займає реальне положення, але надає без видимого glyph. Відкриваючи латунь, потім з'являється, перш за все, незважаючи на те, що позначка або нульовий характер передує його. У строгому парсері з'являються приховані пункти коду до його досягнення `{`, так що звітування першого стовпчика є точною, ніж вигадка. Дисплей і послідовність персонажа просто розкажуть різні історії.
Не видаляйте латунь, яка виглядає правильно, тому що догляд з'являється з ним. Перевірте точку коду в повідомленому офсеті, ввімкніть видимий білий простір або переключіть до шістнадцяткового вигляду. ToolAcre не мовчить видалити провідну BOM перед тим, як парсінг, і його сканер повідомляє про перший несподіваний характер.
Про нас UTF-8 знак замовлення
Про нас UTF-8 byte позначка замовлення — послідовність EF BB BF декодує U+FEFF на початку файлу. Неоднозначний порядок UTF-8, так що знак непотрібний, але деякі редактори та експортні інструменти все ще додають його як підпис кодування. RFC 8259 каже JSON генератори не повинні додавати BOM до мережі JSON, хоча парсери можуть вибрати, щоб ігнорувати одну для взаємодійності. Допуск не може бути припущений через інструменти.
У JavaScript рядок, the BOM є одним символом, хоча його UTF-8 представлення використовує три байти. ToolAcre звітні позиції в рядкових символах, тому провідна марка з'являється в рядку 1, стовпчик 1. Налаштування редактора для збереження UTF-8 без BOM або видалити U+FEFF перед поширенням файлу.
Розумні котирування від текстових процесорів
Розумні котирування з текстових процесорів — типографічне відкриття і закривання позначок виглядають поліровані в прозі, але JSON Визнаєте тільки ASCII Твитнуть0022 як рядок delimiter. U+201C і U+201D є звичайним символом Unicode. Виходячи з рядка, вони не можуть почати ім'я майна або значення, тому валідатор передає смарт-цитувати себе. Автоматичний контроль в чаті, електронній пошті або редактор документа часто вводить зміни після того, як JSON був спочатку дійсний.
Замініть емітери з прямими подвійними котируваннями, потім перевірте апотрофи і позначки, які належать до значення. Кількі котирування ідеально правові як зміст всередині правильної розмежування JSON рядок, такі як `"She said “go”"`; вони несуть лише при запитанні виконати граматичну роботу дельіміра.
Нерозривні пробіли і нульові пропуски
Нерозривні пробіли та нульові пропуски — JSON білий простір є навмисно короткий список: звичайний простір U+0020Вкладка U+0009, лінія подачі U+000A та повернення перевезення U+000D. Нерозривний простір U+00A0 може виглядати ідентично нормальному просторі між колоною і значенням, але не на цьому списку. Нульовий простір U+200B показує нічого на всіх, але він залишається несподіваним персонажем за межами цитованої нитки.
Веб-сторінки використовують нерозривні пробіли, щоб тримати слова разом, а системи обміну повідомленнями можуть вставляти символи нульової ширини для обгортання або обробки сценаріїв. Скопіювати форматовані фрагменти можуть переносити їх в конфігурацію. Заміна конструкцій NBSP символи з звичайними пробілами і видаленням ненав'язливих символів нульового пропуску, керованих повідомленнями.
Створений приклад: config copied від чат повідомлення
Створений приклад: config copied з чат-повідомлень — suppose the видимий текст нагадує `{"mode": "safe"}`, але дійсність не вдається на старті. Гвинтовий вид показує EF BB BF перед латунь. Видалення, що BOM продовжить наступний звіт до цитати перед `mode`, що насправді U+201C. Заміна як смарт-дельімерів з U+0022 потім виводить U+00A0 між колоною і значенням.
Зміна структури нерозривного простору до U+0020 і повірити ще раз. Прийнятий результат може бути відформатований зазвичай. Ця послідовність показує, чому відремонтувати тільки те, що екран з'являється, щоб показати ненадійне: кілька невидимих або виглядають як символи можуть зайняти різні граматичні позиції. Дотримуйтесь кожного рядка та стовпця, визначте фактичну точку коду, зробіть одну навмисну заміну та повторну перевірку.
Як побачити невидимість
Як побачити невидимість — ввімкніть параметр рендер-білого простору редактора, щоб відрізняти вкладки від пробілів і розкрити незвичайні проміжки, після чого скористайтеся інспектором унікоду або переглядом шестигранних символів, які досі виглядають ідентично. Р UTF-8 BOM з'являється як EF BB BF, нерозривний простір як C2 A0 і нульовий простір як E2 80 8Б. Розумне відкриття та закриття котирування з’являються як E2 80 9C і E2 80 9Д.
Зберіть координатну систему діагностики до підрахунку. ToolAcre сканування JavaScript string, так що його стовпці кількість UTF-16 кількість одиниць коду UTF-8 байти. Таким чином, редактор байтів може показати більший нумеричний зсув післяASCII символи. Використовуйте зазначену лінію, щоб звужувати пошук, перевіряючи сусідні пункти коду і перевести тільки в міру необхідності.
Що це не криється
Що це не кришка — мохітек такий, як `café` може бути повністю дійсним JSON. Парсер бачить звичайну послідовність символів рядків і не має доказів, що UTF-8 байти були попередньо декодовані як інше кодування. Таким чином, нерозривний простір або нульовий характер трафіку всередині цитованої значення є синтактичним дійсним. Дійсність ловить символи, які порушують JSON граматика; не можна визначити, чи відповідає дійсність вмісту Unicode.
Відновлення кодування корупції на межі, де байти стають текстом, використовуючи знання оригінальних і помилкових кодувань. Не повторне кодування та декодування JSON рядок до того, як він виглядає краще, оскільки це може пошкодити вже неправильні символи. Нормалізація рівня додатків також окреме рішення: візуально ідентичні послідовності Unicode можуть порівнятися по-різному, залишаючись дійсними.
Поспішайте: довіряйте повідомий стовпчик навіть коли рядок виглядає чисто
Відправка: довіряємо зазначений стовпчик навіть коли рядок виглядає чисто — невидимі символи і виглядають так само, як пунктуація все ще займає точні позиції у джерело. Провідний BOM, curly delimiter, нерозривний простір або нульовий розмітка може запобігти парсер від досягнення бюстгальтера або цитати, які з'являються правильно. Ревекційний білий простір, контрольні пункти або байти і заміна персонажа, конфлікти ідентичності якого з його граматичною роллю, а не редагування поблизу видимого JSON у випадковому порядку.
Пам'ятайте, що позиції можуть розраховувати символи в той час як шестигранний інструмент підрахункує кодовані байти, тому порівняти навколишній текст замість очікування кожного номеру офсету, щоб відповідати. Видалити BOM тільки в документі, що межує з документами, перетворюйте смарт-дельінтери в U+0022 і замінити недійсні структурні скидання без стирання законних Unicode всередині рядків.