【发布时间】:2014-02-01 06:23:06
【问题描述】:
我对尝试使用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äöü
我尝试了许多解决方案,例如“使用语言环境”、其他编码、通过“使用编码”的显式编码等等。
似乎在á 之类的字符中,仅替换了 2 个字节中的 1 个。如果我将替换更改为:
$string =~ s/[^A-Za-z0-9öäü]/_/g;
我得到以下输出:
▒_▒_▒_▒_▒_ö▒_▒_▒_ü▒_▒_▒_▒_▒_▒_▒_▒_▒___▒_▒_▒_▒_▒_abcäüö▒_▒_▒_▒____zdjheäöü
我怎样才能做到这一点?
【问题讨论】:
-
确保将文件保存为 UTF8,并使用
use utf8;(或 BOM)。
标签: regex perl utf-8 character-encoding diacritics