Инструменты разработчика · Сравнение текста
Невидимые различия: неразрывные пробелы, умные кавычки и формы Юникода
· Как это работает
разница текста Юникод отладка
Объясняет, почему строки, которые выглядят одинаково на экране, могут различаться побайтно: от неразрывных пробелов и фигурных кавычек до символов нулевой ширины и разложенных диакритических знаков, а также как их найти.
Две строки, которые выглядят одинаково, но помечены как измененные — открываются с файлом перевода, который не прошел проверку без видимой причины.
Строка перевода может отображаться точно так же, как ее сосед, но все равно не сможет сравниться. Браузерные шрифты скрывают границы кодовых точек, комбинируют акценты и присваивают одинаковые формы разным знакам препинания. ToolAcre сравнивает строки JavaScript только после выбранных преобразований регистра или пробелов, поэтому помеченная строка может выявить реальное текстовое различие.
Доверяйте местоположению, а не предположениям о персонаже. Скопируйте подозрительную строку в редактор, который показывает кодовые точки, или в шестнадцатеричный инспектор. Разница говорит вам, какая строка отличается; он не аннотирует внутреннюю позицию и не называет ответственное значение Unicode.
Неразрывные пробелы и их родственники — объясняет U+00A0 и другие символы пробела, которые вставляют текстовые процессоры, и почему им не соответствует простой пробел.
Неразрывный пробел U+00A0 — это не тот же символ, что обычный пробел U+0020. В обычном режиме их клавиши линий остаются разными. В разделе «Игнорировать пробелы» замена пробелов может уменьшить эти пробеги до обычного пробела после обрезки, в результате чего некоторые такие различия исчезнут.
Этот параметр представляет собой соответствующее преобразование, а не команду очистки Юникода. Отображаемые равные строки сохраняют исходный левый текст, и исправленный документ не создается. Если система публикации требует неразрывного интервала, нормализованное совпадение может скрыть намеренную инструкцию по макету, а не исправить ее.
Режим пробелов может свернуть пробелы Юникода; обычное сравнение сохраняет отдельные символы
Прямые апострофы и кавычки отличаются от типографских открывающих и закрывающих форм. Игнорирование регистра не меняет пунктуацию, а обработка пробелов не перезаписывает кавычки. Таким образом, автозамена текстового процессора может произвести полнострочную замену, даже если с первого взгляда предложение читается одинаково.
Выберите предполагаемую пунктуацию в зависимости от пункта назначения. Исходный код, ключи поиска и форматы данных могут требовать точных символов ASCII, тогда как редакционная копия может предпочитать типографские формы. Сравнение доказывает разницу, но оно не позволяет определить, какая сторона права.
Символы нулевой ширины и направленные символы — охватывают пробелы нулевой ширины, соединения и двунаправленные метки, которые отображаются как ничто, но меняют строку.
Пробелы нулевой ширины, соединения и указатели направления могут занимать позиции строки без рисования видимого глифа. ToolAcre отображает ввод с использованием текстового содержимого, избегая интерпретации HTML, но этот безопасный рендеринг не делает видимыми скрытые точки кода. Они по-прежнему участвуют в обычном равенстве линий.
Направленное поведение также может сделать визуальный порядок ненадежным ориентиром для порядка хранения. Не копируйте подозрительный фрагмент разного направления в команду или идентификатор оболочки только потому, что он выглядит знакомым. Прежде чем что-либо заменять, проверьте точки кода и окружающий контекст с помощью специального инструмента.
Составные и разложенные акценты — объясняет нормализацию NFC и NFD с акцентированной буквой в качестве одной кодовой точки по сравнению с базовой буквой плюс объединяющий знак.
Символ с акцентом может быть представлен как одна заранее составленная кодовая точка или как базовая буква, за которой следует знак объединения. Репозиторий не содержит вызова `normalize`, поэтому канонически эквивалентные формы остаются разными строками JavaScript и могут создавать строки с добавлением и удалением.
Набор тестов доказывает, что идентичные строки Юникода совпадают, а `café` отличается от `cafe`; он не обещает сравнения с учетом графем. Поэтому в этой статье избегаются заявления о сравнении байтов или полной эквивалентности Unicode. Линейный алгоритм получает строки и сравнивает их преобразованные ключи на строгое равенство.
Составные и разложенные акценты остаются разными, поскольку инструмент не выполняет нормализацию Юникода.
Предположим, что строка ресурса отображается без изменений, но помечена. Сначала сравните все отключенные параметры, затем переключите только пробелы. Если строка становится равной, проверьте пробелы и скрытые пробелы. Если он остается измененным, проверьте кавычки, комбинирование знаков и других кодовых точек, а не повторно вводите строку.
Инспектор символов может обнаружить U+00A0 там, где ожидался обычный пробел. Заменяйте его только после подтверждения требований формата. В переведенном контенте неразрывные пробелы могут быть преднамеренными соглашениями о пунктуации, а широкий поиск и замена может повредить правильную типографику в других местах.
Чего это не касается — сравнение сообщает, что линии различаются; он не выполняет нормализацию Юникода и не заменяет символы
Текстовый diff не нормализует NFC или NFD, не идентифицирует сбивающие с толку элементы, не удаляет метки нулевой ширины и не создает исправленный вывод. Он также не сравнивает закодированные байты. Это отдельные операции с последствиями, которые общий компаратор строк не должен выбирать молча.
Игнорировать регистр использует JavaScript `toLowerCase`, а игнорировать пробелы обрезает и уплотняет соответствующие ключи. Ни одна из операций не обеспечивает сопоставление с учетом локали или проверку безопасности Unicode. Используйте выходные данные для сужения расследования, а не для сертификации идентификаторов как безопасных или лингвистически эквивалентных.
Вывод: доверяйте различиям своим глазам — делается вывод, что помеченная строка представляет собой реальную разницу, и показано, как сравнение текста ToolAcre определяет, какие строки проверять.
Если зрение и дифференциал не совпадают, считайте, что строка заслуживает проверки. Алгоритм не имеет визуальной модели, которую можно было бы обмануть с помощью формы шрифта; он видит клавиши линии. Это ограничение полезно, поскольку оно предотвращает передачу скрытых различий только потому, что браузер рисует их одинаково.
Сначала запустите обычное сравнение, запишите, какая опция меняет результат, и проверьте кодовые точки перед редактированием. Этот след доказательств отделяет нормализацию пробелов от пунктуации или композиции и позволяет избежать разрушительной привычки заменять каждый необычный символ приближением ASCII.