我有以下代码可以检测字符串中无效的 utf-8 字符 (正则表达式取自 https://www.w3.org/International/questions/qa-forms-utf-8 和 用于检测无效 UTF-8 字符串的正则表达式)
use strict;
use warnings;
use utf8;
my @Strings=('Caractéristiques techniques','Test string 1');
foreach my $ival (@Strings){
my $TestA=eval{$ival =~
/\A(
[\x00-\x7F] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*\z/x};
if(defined $TestA){
print "$ival is valid utf-8!\n";
} else {
print "$ival is NOT valid utf-8!\n";
}
}
我现在需要一些代码来用有效的 utf-8 用户定义字符替换找到的任何无效字符。
从逻辑上讲,我需要一个正则表达式来替换除了验证正则表达式中的那些值之外的所有内容,但我不知道该怎么做。
我知道要替换除“a 到 z”和“A 到 Z”之外的所有字符,我可以使用
$ival=~s/[^a-zA-Z]//g;
但我不知道如何将这个概念扩展到我的代码中的正则表达式。
注意:我确实有一些字符串包含无效的 utf-8 字符,但此处未给出)
默认情况下,
decode
带有 U+FFFD 替换字符的无效字节。所以你可以使用
my $text_ucp = decode( 'UTF-8', $text_utf8 ) =~ s/\N{ REPLACEMENT CHARACTER }//gr;
(
\N{ REPLACEMENT CHARACTER }
、\N{ U+FFFD }
和 \x{FFFD}
都可以。)