Fluent Validator中文场景下最小长度验证异常问题求助
Fluent Validator 支持Unicode字符长度验证的解决方案
问题原因
Fluent Validator 默认的 MinimumLength 和 MaximumLength 规则是基于字节数进行校验的,而中文等Unicode字符在UTF-8编码下通常占用3个字节。比如输入2个中文时,字节数已经达到6(满足最小3字节的要求),但实际字符数只有2,这就导致最小长度验证看似失效。
解决方法
方法1:使用正则表达式匹配字符数
通过Matches规则结合正则,直接校验Unicode字符的数量范围:
RuleFor(x => x.FirstName) .NotEmpty().WithMessage("Please specify FirstName") .Matches(@"^.{3,500}$").WithMessage("FirstName must be between 3 and 500 characters");
如果需要允许换行符,可以添加正则选项:
.Matches(@"^.{3,500}$", RegexOptions.Singleline)
方法2:自定义验证规则
利用C# string.Length 属性(该属性统计的是Unicode字符数,而非字节数),通过Must规则实现自定义校验:
RuleFor(x => x.FirstName) .NotEmpty().WithMessage("Please specify FirstName") .Must(name => name.Length >= 3 && name.Length <= 500) .WithMessage("FirstName must be between 3 and 500 characters");
补充说明
默认的MinimumLength/MaximumLength内部依赖StringLengthValidator,若未指定编码,会默认使用UTF-8字节数判断。上述两种方法直接基于字符数校验,能准确支持中文等Unicode字符的长度验证需求。
内容的提问来源于stack exchange,提问作者NSS
相关产品推荐
相关产品推荐

