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

Lin*_*ing 0 regex perl utf-8 diacritics character-encoding

我对我尝试写的函数感到绝望Perl.我的功能是过滤特定字符的字符串.我允许一些角色A-Z, a-z, 0-9,我想也允许一些德国变形金刚.但每次我在正则表达式中定义它们时,替换都会失败.

我的编码是UTF-8(server,perl,scripts).

这是我的功能:

sub cleanXSS{

    my $string = shift;

    $string =~ s/[^A-Za-z0-9öäü]//g;

    return $string;
}
Run Code Online (Sandbox Code Playgroud)

我的脚本看起来像这样:

my $scalar = "áéíóúÁÉÍüÓÚâêÄîôßû()ÂÊÎÔÛabcäüöÄÜÖý#µzdjheäöü";
print cleanXSS($scalar)."\n";
Run Code Online (Sandbox Code Playgroud)

因此它应该替换除A-Z, a-z, 0-9小写变音符号以外的所有字符.在我的测试字符串中替换德语变音符合工作正常,但似乎所有其他拉丁字符只是部分替换.

控制台输出如下所示:

?????????ü??????????????abcäüö????zdjheäöü
Run Code Online (Sandbox Code Playgroud)

我尝试过很多解决方法,比如"使用locale",其他编码,通过"使用Encode"进行显式编码等等.

似乎在一个字符中,á只替换了2个字节中的1个.如果我将我的替换更改为:

$string =~ s/[^A-Za-z0-9öäü]/_/g;
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

?_?_?_?_?_ö?_?_?_ü?_?_?_?_?_?_?_?_?___?_?_?_?_?_abcäüö?_?_?_?____zdjheäöü
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

ike*_*ami 7

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

  1. 解码输入.

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

    use utf8;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编码输出.

    您还需要以下内容来编码输出:

    use open ':std', ':encoding(UTF-8)';
    
    Run Code Online (Sandbox Code Playgroud)

  • _file_可能是UTF-8,但你没有告诉_Perl_.默认情况下,Perl假定文件是ISO-8859-1. (2认同)