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)
我怎样才能做到这一点?
似乎在像"á"这样的字符中,只替换了2个字节中的1个.
解码输入.
您没有告诉Perl您的脚本是使用UTF-8编码的.加
use utf8;
Run Code Online (Sandbox Code Playgroud)编码输出.
您还需要以下内容来编码输出:
use open ':std', ':encoding(UTF-8)';
Run Code Online (Sandbox Code Playgroud)