Perl正则表达式替换为UTF-8字符

时间:2014-01-13 13:24:16

标签: regex perl utf-8 character-encoding diacritics

我对我尝试使用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äöü

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:7)

  

似乎在像“á”这样的字符中,只替换了2个字节中的1个。

  1. 解码输入。

    您没有告诉Perl您的脚本是使用UTF-8编码的。添加

    use utf8;
    
  2. 编码输出。

    您还需要以下内容对输出进行编码:

    use open ':std', ':encoding(UTF-8)';
    

答案 1 :(得分:0)

将此行放在脚本的开头:

binmode STDOUT, ":encoding(UTF-8)";

请参阅doc