ksh*_*erd 10
这是正则表达式,它只匹配有效的UTF-8字节序列:
/^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/
Run Code Online (Sandbox Code Playgroud)
我从RFC 3629 UTF-8中获得了它,这是ISO 10646第4节的转换格式 - UTF-8字节序列的语法.
对上述因素进行分解会略微缩短:
/^([\x00-\x7F]|([\xC2-\xDF]|\xE0[\xA0-\xBF]|\xED[\x80-\x9F]|(|[\xE1-\xEC]|[\xEE-\xEF]|\xF0[\x90-\xBF]|\xF4[\x80-\x8F]|[\xF1-\xF3][\x80-\xBF])[\x80-\xBF])[\x80-\xBF])*$/
Run Code Online (Sandbox Code Playgroud)
这个简单的perl脚本演示了用法:
#!/usr/bin/perl -w
my $passstring = "This string \xEF\xBF\xBD == ? is valid UTF-8";
my $failstring = "This string \x{FFFD} == ? is not valid UTF-8";
if ($passstring =~ /^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/)
{
print 'Passstring passed'."\n";
}
else
{
print 'Passstring did not pass'."\n";
}
if ($failstring =~ /^([\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|[\xEE-\xEF][\x80-\xBF]{2}|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$/)
{
print 'Failstring passed'."\n";
}
else
{
print 'Failstring did not pass'."\n";
}
exit;
Run Code Online (Sandbox Code Playgroud)
它产生以下输出:
Passstring passed
Failstring did not pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9709 次 |
| 最近记录: |