如何在perl中以字符串形式显示代理项对

如何在perl中以字符串形式显示代理项对,perl,unicode,surrogate-pairs,Perl,Unicode,Surrogate Pairs,我正在使用perl代码库来验证客户输入,我的目标是阻止代理字符 我的想法是首先将客户输入编码为UTF-16和 foreach my $messageChar (@MessageChars) { my $messageCharUTF16 = Encode::encode("UTF-16", $messageChar); if (($messageCharUTF16 >= 0xD800 && $messageCharUTF16 <= 0xDBFF)|( $m

我正在使用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中,有没有直接的方法来验证字符串是否包含代理字符?

我不清楚要检查什么,所以我将介绍这两种可能性

检查解码字符串是否包含U+D800..U+DFFF中的任何一个

官方的Unicode标准表示,没有任何UTF表单(包括UTF-16)可以对这些代码点进行编码,Perl也不例外

$perl-e'使用open:std,:encodingUTF-8;打印ABC\N{U+D800}DEF\N;' Unicode代理U+D800在UTF-8 at-e第1行中是非法的。 \x{d800}未映射到-e第1行的utf8。 ABC\x{D800}DEF 要检查这些字符,可以使用

$str =~ /[\x{D800}-\x{DFFF}]/
eval { encode("UTF-8", $str, Encode::FB_CROAK | Encode::LEAVE_SRC); 1 }
$str =~ /[^\0-\x{FFFF}]/
要检查任何编码错误,可以使用

$str =~ /[\x{D800}-\x{DFFF}]/
eval { encode("UTF-8", $str, Encode::FB_CROAK | Encode::LEAVE_SRC); 1 }
$str =~ /[^\0-\x{FFFF}]/
检查解码字符串是否包含U+FFFF以上的字符

U+FFFF以上的字符不能使用UCS-2进行编码,需要使用UTF-16进行代理编码

$perl-e'使用open:std,:encodingUTF-16le;打印\N{U+10000};'|od-t2 0000000 d800 dc00 0000004 要检查这些字符,可以使用

$str =~ /[\x{D800}-\x{DFFF}]/
eval { encode("UTF-8", $str, Encode::FB_CROAK | Encode::LEAVE_SRC); 1 }
$str =~ /[^\0-\x{FFFF}]/

我不清楚你想检查什么,所以我将涵盖这两种可能性

检查解码字符串是否包含U+D800..U+DFFF中的任何一个

官方的Unicode标准表示,没有任何UTF表单(包括UTF-16)可以对这些代码点进行编码,Perl也不例外

$perl-e'使用open:std,:encodingUTF-8;打印ABC\N{U+D800}DEF\N;' Unicode代理U+D800在UTF-8 at-e第1行中是非法的。 \x{d800}未映射到-e第1行的utf8。 ABC\x{D800}DEF 要检查这些字符,可以使用

$str =~ /[\x{D800}-\x{DFFF}]/
eval { encode("UTF-8", $str, Encode::FB_CROAK | Encode::LEAVE_SRC); 1 }
$str =~ /[^\0-\x{FFFF}]/
要检查任何编码错误,可以使用

$str =~ /[\x{D800}-\x{DFFF}]/
eval { encode("UTF-8", $str, Encode::FB_CROAK | Encode::LEAVE_SRC); 1 }
$str =~ /[^\0-\x{FFFF}]/
检查解码字符串是否包含U+FFFF以上的字符

U+FFFF以上的字符不能使用UCS-2进行编码,需要使用UTF-16进行代理编码

$perl-e'使用open:std,:encodingUTF-16le;打印\N{U+10000};'|od-t2 0000000 d800 dc00 0000004 要检查这些字符,可以使用

$str =~ /[\x{D800}-\x{DFFF}]/
eval { encode("UTF-8", $str, Encode::FB_CROAK | Encode::LEAVE_SRC); 1 }
$str =~ /[^\0-\x{FFFF}]/