2011-07-13 58 views
3

我正在使用控制字符進行文本分離的書目記錄。當我在替代操作中使用Unicode字符名稱「STRING TERMINATOR」時,如果文本包含「Ü」,則會出現「格式錯誤的UTF-8字符」警告。替代工作與其他Unicode字符的名稱和含有 「ü」, 「A」, 「E」,文字...charnames,substitutions和Umlaut「Ü」:格式不正確的UTF-8字符

#!/usr/bin/perl 

use v5.12; 

use utf8; 
use strict; 
use autodie; 
use warnings; 
# use warnings qw< FATAL utf8  >; 
use charnames qw<:full>; 
use feature  qw<unicode_strings>; 

binmode STDOUT, ':utf8'; 

my @records = (qq[\N{U+0098}L'\N{U+009c} Année du Figaro], qq[\N{U+0098}The\N{U+009c} famous ümläut], qq[\N{U+0098}The\N{U+009c} famous Ümlaut], qq[\N{U+0098}\N{U+00DC}\N{U+009c}]); 

my %replace = (
    "\N{START OF STRING}"  => "<ns>", 
    "\N{STRING TERMINATOR}" => "</ns>", 
); 
my $regex = join "|", keys %replace; 
$regex = qr/$regex/; 

foreach my $record (@records){ 
    $record =~ s/($regex)/$replace{$1}/g; 
    say $record; 
}; 

我用草莓的Perl v5.12.3.0。

怎樣才能避免這些警告?

感謝,jorol

回答

0

如果可能的話,你可以有一個散列所有Unicode字符的列表,並處理之前取代它,以避免Perl的版本警告你有

這樣的事情,

my $Description = "famous Ümlaut"; 
my %UMLAUTE = ( 
    'Ä' => 'Ae', 
    'Ö' => 'Oe', 
    'Ü' => 'Ue', 
    'ä' => 'ae', 
    'ö' => 'oe', 
    'ü' => 'ue', 
    'ß' => 'ss', 
    'é' => 'e' 
); 

my @UMLKEYS = join("|", keys(%UMLAUTE)); 
$Description =~ s/(@UMLKEYS)/$UMLAUTE{$1}/g; 

這將導致「着名的Uemlaut」