我正在使用perl代码库来验证客户输入,我的目标是阻止代理字符。
我的想法是首先将客户输入编码为UTF-16和
foreach my $messageChar (@MessageChars) {
my $messageCharUTF16 = Encode::encode("UTF-16", $messageChar);
if (($messageCharUTF16 >= 0xD800 && $messageCharUTF16 <= 0xDBFF)|( $messageCharUTF16 >= 0xDC00 && $messageCharUTF16 <= 0xDFFF)) {
// Then we have surrogate pairs
}
}
但是,我没有从Encode :: encode获得正确的UTF-16值。
我如何揭示代理对?是否有任何直接的方法来验证字符串是否包含Perl中的代理字符?
答案 0 :(得分:4)
我不清楚你想要检查什么,所以我将介绍两种可能性。
检查解码后的字符串是否包含任何U + D800..U + DFFF
官方的Unicode标准表明,没有UTF格式(包括UTF-16)可以对这些代码点进行编码,而Perl也有此要求。
$ perl -e'use open ":std", ":encoding(UTF-8)"; print "ABC\N{U+D800}DEF\n";'
Unicode surrogate U+D800 is illegal in UTF-8 at -e line 1.
"\x{d800}" does not map to utf8 at -e line 1.
ABC\x{D800}DEF
要检查这些字符,可以使用
$str =~ /[\x{D800}-\x{DFFF}]/
要检查是否存在任何编码错误,您可以使用
eval { encode("UTF-8", $str, Encode::FB_CROAK | Encode::LEAVE_SRC); 1 }
检查解码后的字符串是否包含U + FFFF以上的字符
U + FFFF以上的字符无法使用UCS-2进行编码,并且需要代理使用UTF-16进行编码。
$ perl -e'use open ":std", ":encoding(UTF-16le)"; print "\N{U+10000}";' | od -t x2
0000000 d800 dc00
0000004
要检查这些字符,可以使用
$str =~ /[^\0-\x{FFFF}]/