Работа с многоязычными данными в Validator.js требует понимания того, как библиотека взаимодействует с Unicode, локалями и особенностями различных письменностей. Валидация строк, содержащих символы разных алфавитов, существенно отличается от проверки классического ASCII-текста, поскольку включает диакритические знаки, комбинируемые символы, различные кодировки и особенности нормализации Unicode.
Validator.js в большинстве методов опирается на строковую обработку JavaScript, где строки представлены в UTF-16. Это означает, что один видимый символ может состоять из одного или двух кодовых юнитов. Например, эмодзи или редкие иероглифы могут занимать суррогатные пары.
При проверке таких строк методы вроде isLength,
isAlpha, isAlphanumeric работают не с
«символами в человеческом понимании», а с кодовыми единицами, что
создаёт важный контекст для интерпретации результатов.
Разные алфавиты допускают несколько форм записи одного и того же символа. Например, латинская буква «é» может быть представлена:
U+00E9e + U+0301Эти формы визуально идентичны, но технически различны.
Перед валидацией часто применяется нормализация:
const normalized = str.normalize('NFC');
Формы:
Validator.js не выполняет нормализацию автоматически, поэтому несогласованность данных может приводить к неожиданным результатам при проверках длины и состава символов.
Одной из ключевых особенностей является поддержка локалей:
const validator = require('validator');
validator.isAlpha('Привет', 'ru-RU');
validator.isAlpha('hello', 'en-US');
Параметр локали определяет допустимые диапазоны Unicode.
Примеры поведения:
ru-RU — разрешает кириллицуen-US — разрешает латиницу без диакритикиpl-PL — допускает польские диакритические символыtr-TR — учитывает специфические турецкие буквыДля числово-буквенной проверки:
validator.isAlphanumeric('Москва2024', 'ru-RU');
Кириллица включает расширенный набор символов для разных языков: русский, украинский, болгарский, сербский и другие.
Особенности проверки:
Пример:
validator.isAlpha('Доброеутро', 'ru-RU'); // true
validator.isAlpha('Доброе утро', 'ru-RU'); // false (пробел)
Для обработки составных выражений обычно комбинируется с
whitelist:
validator.whitelist('Доброе утро', 'А-Яа-я ');
Латинские алфавиты разных языков содержат множество модификаций:
При использовании en-US такие символы могут считаться
недопустимыми:
validator.isAlpha('café', 'en-US'); // false
Варианты решения:
fr-FRvalidator.isAlpha('café', 'fr-FR'); // true
Арабский алфавит имеет особенности:
Validator.js поддерживает арабские символы через Unicode-диапазоны локалей или кастомные проверки.
Пример:
validator.isAlpha('مرحبا', 'ar');
При этом важно учитывать, что пробелы и знаки пунктуации часто требуют отдельной обработки.
Китайская письменность (ханьцзы) представляет собой идеографическую систему, где один символ несёт смысл.
validator.isAlpha('你好', 'zh-CN');
Особенности:
Валидация часто расширяется дополнительными проверками диапазонов Unicode:
Греческий язык включает символы с диакритикой и вариативные формы:
validator.isAlpha('Γειά', 'el-GR');
Особенности:
Некоторые языки используют комбинирующие знаки:
Например:
e + ́ = é
Validator.js может интерпретировать такие последовательности как несколько символов, что влияет на:
isLengthisAlphaРекомендуется предварительная нормализация:
const safe = str.normalize('NFC');
validator.isAlpha(safe, 'fr-FR');
Стандартные регулярные выражения JavaScript долгое время не поддерживали полноценную работу с Unicode-свойствами.
Современный подход:
/^\p{L}+$/u.test('Текст');
Validator.js частично абстрагирует это, но при создании кастомных
валидаторов часто требуется использование u-флага и Unicode
property escapes.
Стандартных локалей может быть недостаточно при смешанных данных:
const isMultiAlphabet = (str) => {
return validator.whitelist(str, 'A-Za-zА-Яа-я一-龯');
};
Подходы:
whitelist и blacklistconst isValidName = (value) => {
const normalized = value.normalize('NFC');
return validator.whitelist(normalized, 'A-Za-zА-Яа-яЁёĀ-ž一-龯 ');
};
const isIdentifier = (value) => {
return validator.isAlphanumeric(value, 'en-US') ||
validator.isAlphanumeric(value, 'ru-RU');
};
При работе с разными алфавитами возникают типовые сложности:
Для защиты часто комбинируются:
validator.trim(str);
validator.escape(str);
validator.blacklist(str, '\u200B\u200C\u200D');
Многоязычный ввод увеличивает поверхность атак:
Типовой защитный слой:
const clean = validator.normalizeEmail(email);
const safe = validator.whitelist(input.normalize('NFC'), allowedSet);
Работа с разными алфавитами в Validator.js опирается на сочетание локалей, Unicode-нормализации, диапазонов символов и ручной настройки правил валидации, поскольку универсального набора проверок для всех письменностей не существует.