Перейти к содержимому
Ghostchars

Нулевая ширина и невидимые

ZERO WIDTH NO-BREAK SPACE (U+FEFF)

ufeff, он же U+FEFF, это метка порядка байтов, то есть BOM. В самом начале файла она объявляет кодировку; в любом другом месте это невидимое неразрывное ничто, применение которого Unicode считает устаревшим начиная с версии 3.2.

Кодовая позиция
U+FEFF
Другие записи
ufeff\ufeff
Удаляется по умолчанию
Да
Управляющий параметр
Параметр не нужен
Может нести нагрузку
Нет

Скопировать и вставить U+FEFF

Чтобы скопировать и вставить ZERO WIDTH NO-BREAK SPACE (U+FEFF), нажмите кнопку: в буфер обмена попадёт сам символ, а Ctrl+V (Cmd+V на Mac) вставит его в любое место, где можно печатать.

Откуда он берётся

Редакторы под Windows, выгрузки из Excel и всё, что сохраняет «UTF-8 с BOM». Склейка нескольких таких файлов оставляет BOM в середине результата. Приходит она и со вставкой: скопируйте ячейку таблицы, строку из редактора или содержимое веб-формы, и текст может начинаться с невидимого символа, поле поиска при этом выглядит совершенно обычным, а запрос всё равно ничего не находит.

Почему это важно

BOM в начале ломает разбор JSON, YAML-фронтматтер, shebang в скриптах и заголовки CSV; BOM в середине остаётся просто невидимым символом, из-за которого не совпадают две одинаковые на вид строки. Это же и причина, по которой файл настроек «выглядит нормально», но не загружается.

До и после

ZERO WIDTH NO-BREAK SPACE (U+FEFF) до и после очистки, скрытый символ показан подписанной плашкой
Справочная карточка этого символа: кодовая позиция, вердикт и то же самое до и после, одной картинкой.
ДоU+FEFF{"ok": true}
После{"ok": true}

Именно из-за невидимого первого символа `JSON.parse` отказывается разбирать эту строку.

Символ показан подписанной плашкой, чтобы было видно, где он стоит. В вашем тексте он не рисует ровно ничего.

Когда он уместен

Первым символом файла, как признак кодировки, потому что это свойство ФАЙЛА, а не текста. Как только текст оказался в поле для вставки, законного BOM в нём уже нет.

Как его удалить

Базовый проход удаляет её, где бы она ни стояла. Ghostchars работает с текстом, поэтому и ведущий BOM для него тоже текст.

Текст лежит в файле, а не в буфере обмена? Отчёт по документу для .docx, .odt и .html находит символ внутри файла вместе со скрытыми фрагментами и исправлениями, и открывать файл для этого не нужно. Если вопрос в том, что делает остальной текст, а не этот один символ, можно измерить разброс длины предложений и увидеть, где проявляется каждая привычка: без баллов и без утверждений о том, кто написал текст.

Это водяной знак ИИ?

Не водяной знак

Нет. BOM остаётся артефактом кодировки, который создают редакторы и конвейеры экспорта. Он говорит о программе, сохранившей файл, и ничего не говорит о том, кто написал слова.

Никак не связан с машинно сгенерированным текстом. Он приходит из программы, с клавиатуры или от человека.

Вопросы

Почему вставленный текст начинается с невидимого символа?

Почти всегда это BOM, приехавший вместе с копией: источник поставил в начало U+FEFF, и он пришёл вместе со всеми видимыми символами за ним. Базовый проход его удаляет. Чтобы увидеть его до чистки, вставьте текст сюда и переключитесь на «Показать скрытое»: там ufeff перед первой буквой будет отмечен.

Почему мой JSON не разбирается?

Ведущий BOM стоит символом перед открывающей фигурной скобкой. Большинство разборщиков JSON считают его недопустимым, и ошибка указывает на позицию 0, где глазу не видно ничего.

Это то же самое, что соединитель слов?

В середине текста они ведут себя одинаково. Unicode объявил такое применение U+FEFF устаревшим и назначил правильным символом U+2060 WORD JOINER, оставив U+FEFF только роль метки порядка байтов.

Проверьте свой текст

Вставьте что угодно в инструмент очистки, чтобы увидеть каждый скрытый символ: позицию, кодовую позицию и то, что произойдёт с каждым из них. Ничего никуда не отправляется.

Проверьте свой текстОчищать в Chrome прямо при вставкеОчищать на Mac одной комбинацией клавишВсе символы

Анонимная статистика?

Ghostchars обрабатывает ваш текст в браузере и никуда его не отправляет. Мы хотели бы считать просмотры страниц через собственный сервер аналитики, почти без cookie: содержимое не собирается никогда.