В текстовых данных, особенно при работе с восточноазиатскими языками, символы могут существовать в двух визуально и семантически различающихся формах: fullwidth (полная ширина) и halfwidth (половинная ширина). Эти формы отличаются не только отображением, но и кодировкой в Unicode.
Символы полной ширины занимают фиксированное пространство, эквивалентное ширине иероглифа. Символы половинной ширины визуально сжаты и чаще встречаются в латинском алфавите, цифрах и базовой пунктуации.
Валидационные декораторы class-validator позволяют
проверять соответствие строк этим правилам:
@IsFullWidth() — строка должна содержать только символы
полной ширины@IsHalfWidth() — строка должна содержать только символы
половинной шириныДекоратор @IsFullWidth() проверяет, что все символы
строки относятся к Unicode-блокам полной ширины. К таким символам
относятся:
Внутренняя проверка обычно основана на регулярных выражениях, охватывающих диапазоны Unicode, например:
\uFF01–\uFF60 — полноширинные ASCII-аналоги\uFFE0–\uFFE6 — дополнительные символы валют и
пунктуацииimport { IsFullWidth } from 'class-validator';
class CreateMessageDto {
@IsFullWidth()
content: string;
}
В этом случае строка content должна состоять
исключительно из символов полной ширины.
Hello World
123456
コンニチハ
你好世界
Все эти строки используют fullwidth-символы или иероглифы.
Hello World
123456
Hello World (смешанный набор)
Любой ASCII-символ в половинной ширине делает строку невалидной.
@IsFullWidth() используется в системах, где требуется
строгое соответствие визуальному формату:
Декоратор @IsHalfWidth() ограничивает строку только
символами половинной ширины. Проверка исключает:
Разрешены:
import { IsHalfWidth } from 'class-validator';
class LoginDto {
@IsHalfWidth()
username: string;
}
HelloWorld
user123
ハンカクカタカナ
email@example.com
Hello
12345
こんにちは
Любой символ полной ширины нарушает правило.
| Декоратор | Допустимые символы | Основная область применения |
|---|---|---|
@IsFullWidth() |
Только fullwidth/ideographs | Формы CJK, строгие шаблоны |
@IsHalfWidth() |
Только ASCII/halfwidth | Логины, email-подобные поля |
Оба декоратора работают по принципу строгой проверки всей строки:
Fullwidth-символы разработаны для унификации визуального представления в вертикальных и моноширинных системах отображения. Они:
Примеры:
Halfwidth-форма представляет собой компактный вариант символов:
Примеры:
Оба декоратора:
По умолчанию библиотека генерирует стандартные сообщения:
@IsFullWidth() → “must contain full-width
characters”@IsHalfWidth() → “must contain half-width
characters”Сообщения могут быть переопределены:
@IsFullWidth({ message: 'Поле должно содержать символы полной ширины' })
content: string;
В контексте NestJS DTO часто комбинируются с другими валидаторами:
import { IsString, Length } from 'class-validator';
import { IsHalfWidth } from 'class-validator';
class UserDto {
@IsString()
@IsHalfWidth()
@Length(3, 20)
username: string;
}
Такой подход позволяет одновременно:
Строка может выглядеть одинаково визуально, но содержать разные кодовые точки:
A (U+0041) ≠ A (U+FF21)
Это критично при:
Перед применением валидации иногда требуется нормализация:
Однако class-validator не выполняет автоматическую
нормализацию, проверка осуществляется “как есть”.
Отдельный случай — японская halfwidth катакана:
ハンカク
Она проходит @IsHalfWidth(), но не проходит
@IsFullWidth().
Обычно эти декораторы используются вместе с:
@IsString() — проверка типа@Matches() — дополнительные регулярные ограничения@Length() — контроль размера строки@IsNotEmpty() — запрет пустых значенийКомбинация позволяет строить строгие правила ввода для интернациональных систем.