@IsMultibyte

Проверка IsMultibyte относится к группе валидаторов, работающих со строками и анализирующих их байтовое представление. Основное назначение — определить, содержит ли строка многобайтовые символы, то есть символы, выходящие за пределы стандартного ASCII-набора.

Данный валидатор используется через декоратор из библиотеки class-validator и опирается на реализацию из validator.js, где функция isMultibyte выполняет проверку строки на наличие хотя бы одного символа, требующего более одного байта для кодирования.


Многобайтовые символы встречаются в различных языках и системах письма: кириллица, иероглифы, символы с диакритикой, эмодзи и другие расширенные наборы Unicode. Проверка позволяет:

  • выявлять строки, содержащие нелатинские символы;
  • ограничивать ввод только ASCII-символами или, наоборот, требовать наличие расширенного набора;
  • выполнять предварительную валидацию данных перед сохранением или передачей в системы с ограниченной кодировкой;
  • контролировать формат текстовых полей, где важна локализация или её отсутствие.

Поведение валидации

Логика проверки строится на анализе строки:

  • если строка содержит хотя бы один символ, занимающий более одного байта, результат считается успешным;
  • если строка состоит исключительно из ASCII-символов (латиница, цифры, базовая пунктуация), проверка не проходит.

Важно учитывать, что валидатор не интерпретирует семантику текста. Он работает исключительно на уровне байтового представления символов.


Сигнатура и параметры

Декоратор не принимает дополнительных параметров, кроме стандартных опций валидации class-validator:

  • сообщение об ошибке;
  • условия группировки;
  • контексты выполнения.

Базовое использование не требует конфигурации, так как проверка бинарная: соответствует или не соответствует условию.


Типичные сценарии применения

Использование проверки встречается в следующих случаях:

  • формы регистрации, где требуется определить язык ввода имени;
  • поля профиля пользователя, где допускается только локализованный ввод;
  • системы фильтрации контента, разделяющие ASCII и Unicode данные;
  • API, где определённые поля должны содержать символы национальных алфавитов.

Примеры использования

Базовая модель DTO

import { IsMultibyte } from 'class-validator';

export class CreateProfileDto {
  @IsMultibyte()
  displayName: string;
}

В данном случае поле displayName должно содержать хотя бы один символ, выходящий за пределы ASCII. Строка "John" не пройдёт проверку, тогда как "Иван" или "山田" будет считаться валидной.


Пример с ограничением формата данных

import { IsMultibyte, IsNotEmpty } from 'class-validator';

export class UpdateCommentDto {
  @IsNotEmpty()
  @IsMultibyte()
  text: string;
}

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


Интеграция с NestJS DTO

В архитектуре NestJS валидаторы применяются на уровне DTO-классов. IsMultibyte становится частью цепочки проверки входящих данных:

import { IsMultibyte, Length } from 'class-validator';

export class MessageDto {
  @Length(1, 200)
  @IsMultibyte()
  content: string;
}

Валидация выполняется автоматически при использовании ValidationPipe, что позволяет отсеивать некорректные запросы до попадания в бизнес-логику приложения.


Комбинация с другими декораторами

IsMultibyte редко используется изолированно. Чаще он включается в набор правил:

  • @IsString() — проверка типа;
  • @Length() — ограничение длины;
  • @Matches() — проверка регулярных выражений;
  • @IsOptional() — условное применение валидации.

Комбинация позволяет строить точные правила ввода, например:

import { IsString, IsMultibyte, Length, Matches } from 'class-validator';

export class LocalizedTitleDto {
  @IsString()
  @IsMultibyte()
  @Length(3, 100)
  @Matches(/^[^0-9]*$/)
  title: string;
}

Такой набор ограничивает использование цифр и одновременно требует наличие многобайтовых символов.


Кастомизация сообщений об ошибках

Поведение по умолчанию можно переопределить через опцию сообщения:

@IsMultibyte({ message: 'Поле должно содержать символы Unicode' })
name: string;

Сообщение формируется при провале проверки и может использоваться системой интернационализации.


Пограничные случаи и особенности

При использовании IsMultibyte необходимо учитывать ряд особенностей:

  • строка, содержащая только пробелы и ASCII-символы, не проходит проверку;
  • эмодзи считаются многобайтовыми символами и удовлетворяют условию;
  • смешанные строки (ASCII + Unicode) также считаются валидными;
  • поведение зависит от реализации validator.js и может отличаться в редких крайних случаях обработки Unicode.

Также следует учитывать, что валидатор не анализирует язык или смысл текста, а только его байтовую структуру, что может приводить к ложным трактовкам в бизнес-логике, если использовать его не по назначению.