簡體   English   中英

Perl正則表達式替換為UTF-8字符

[英]Perl regex replace with UTF-8 characters

我對嘗試用Perl編寫的函數感到絕望。 我的功能是為特定字符過濾字符串。 我允許一些字符,例如AZ, az, 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";

因此,它應該替換除AZ, az, 0-9和小寫變音符號之外的所有字符。 在我的測試字符串中替換德國變音符的效果很好,但似乎所有其他拉丁字符僅被部分替換了。

控制台輸出如下所示:

▒▒▒▒▒▒▒▒▒ü▒▒▒▒▒▒▒▒▒▒▒▒▒▒abcäüö▒▒▒▒zdjheäöü

我嘗試了許多解決方案,例如“使用區域設置”,其他編碼,通過“使用編碼”的顯式編碼等等。

似乎在á這樣的字符中,僅2個字節中的1個被替換了。 如果我將替換項更改為此:

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

我得到以下輸出:

▒_▒_▒_▒_▒_ö▒_▒_▒_ü▒_▒_▒_▒_▒_▒_▒_▒_▒___▒_▒_▒_▒_▒_abcäüö▒_▒_▒_▒____zdjheäöü

我該如何實現?

似乎在類似“á”的字符中,只有2個字節中的1個被替換了。

  1. 解碼輸入。

    您沒有告訴Perl您的腳本是使用UTF-8編碼的。

     use utf8; 
  2. 編碼輸出。

    您還需要執行以下操作來編碼輸出:

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

將這一行放在腳本的開頭:

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

參閱文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM