我对我尝试使用Perl
编写的函数感到绝望。我的功能是过滤特定字符的字符串。我允许一些像A-Z, a-z, 0-9
这样的角色,我也希望允许一些德国变形金刚。但每次我在正则表达式中定义它们时,替换都会失败。
我的编码是UTF-8
(服务器,perl,脚本)。
这是我的功能:
sub cleanXSS{
my $string = shift;
$string =~ s/[^A-Za-z0-9öäü]//g;
return $string;
}
我的脚本如下所示:
my $scalar = "áéíóúÁÉÍüÓÚâêÄîôßû()ÂÊÎÔÛabcäüöÄÜÖý#µzdjheäöü";
print cleanXSS($scalar)."\n";
所以它应该替换除A-Z, a-z, 0-9
和小写元音符之外的所有字符。在我的测试字符串中替换德语变音符合工作正常,但似乎所有其他拉丁字符只是部分替换。
控制台输出如下所示:
▒▒▒▒▒▒▒▒▒ü▒▒▒▒▒▒▒▒▒▒▒▒▒▒abcäüö▒▒▒▒zdjheäöü
我尝试过很多解决方法,比如“使用locale”,其他编码,通过“使用Encode”进行显式编码等等。
似乎在á
这样的字符中,只替换了2个字节中的1个。如果我将我的替换改为:
$string =~ s/[^A-Za-z0-9öäü]/_/g;
我得到以下输出:
▒_▒_▒_▒_▒_ö▒_▒_▒_ü▒_▒_▒_▒_▒_▒_▒_▒_▒___▒_▒_▒_▒_▒_abcäüö▒_▒_▒_▒____zdjheäöü
我怎样才能做到这一点?
答案 0 :(得分:7)
似乎在像“á”这样的字符中,只替换了2个字节中的1个。
解码输入。
您没有告诉Perl您的脚本是使用UTF-8编码的。添加
use utf8;
编码输出。
您还需要以下内容对输出进行编码:
use open ':std', ':encoding(UTF-8)';
答案 1 :(得分:0)