Диакритические знаки представляют собой комбинируемые символы, добавляемые к базовым буквам для изменения их произношения или смысла. В Unicode такие символы могут храниться как в виде предварительно составленных символов (например, «é»), так и в виде комбинации базовой буквы и диакритики (например, «e» + « ́»).
При обработке пользовательского ввода в JavaScript это приводит к различным проблемам: сравнение строк становится некорректным, фильтрация по шаблонам работает нестабильно, а валидация данных теряет предсказуемость.
Перед удалением диакритических знаков строка приводится к нормализованной форме Unicode. На практике чаще всего используется форма NFD (Normalization Form Decomposition), которая разделяет символы на базовые и комбинируемые элементы.
const normalized = str.normalize('NFD');
После такого преобразования символ «é» превращается в последовательность «e» + «◌́», что позволяет удалить диакритические элементы стандартным регулярным выражением.
Комбинируемые диакритические знаки в Unicode находятся в диапазоне
\u0300–\u036f. Их удаление осуществляется через фильтрацию
символов:
function removeDiacritics(value) {
return value
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '');
}
Результатом становится строка, очищенная от акцентов и надстрочных знаков, но сохраняющая базовую буквенную структуру.
Библиотека Validator.js предоставляет набор стандартных функций для проверки строк, но не включает встроенного механизма удаления диакритики. Поэтому подобная логика добавляется как вспомогательный слой перед валидацией.
import validator from 'validator';
function normalizeInput(value) {
return value
.trim()
.toLowerCase()
.replace(/[\u0300-\u036f]/g, '');
}
const input = 'Crème Brûlée';
const normalized = normalizeInput(input);
const isValid = validator.isAlpha(normalized);
Такой подход позволяет обеспечить корректную работу проверок, ориентированных на ASCII-символы.
Удаление диакритических знаков критично в сценариях, где используется:
isAlpha для проверки буквенных строкisAlphanumeric для идентификаторовБез предварительной обработки строки с одинаковым смыслом могут восприниматься как разные:
Помимо NFD существует форма NFKD, которая дополнительно выполняет совместимостное разложение символов. Она применяется, когда требуется более агрессивная нормализация текста.
function removeDiacriticsStrict(value) {
return value
.normalize('NFKD')
.replace(/[\u0300-\u036f]/g, '');
}
Выбор между NFD и NFKD зависит от требований к сохранению визуальной и семантической структуры строки.
Удаление диакритики через нормализацию не покрывает все языковые случаи:
Пример:
Валидация часто строится как цепочка преобразований перед проверкой:
function prepare(value) {
return validator.trim(
value
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
);
}
const username = prepare(' José ');
const valid = validator.isAlphanumeric(username);
Такой подход позволяет стандартизировать входные данные до применения строгих правил библиотеки.
Удаление диакритических знаков используется в системах, где требуется унификация строк:
В сочетании с Validator.js это формирует предсказуемый слой предварительной обработки перед проверками форматов данных.
Операция normalize() относительно затратна при массовой
обработке данных. При больших объёмах входного потока целесообразно:
const cache = new Map();
function cachedNormalize(value) {
if (cache.has(value)) return cache.get(value);
const result = value
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '');
cache.set(value, result);
return result;
}