символы, замены и умлаут "Ü": неправильный характер UTF-8 - PullRequest
3 голосов
/ 13 июля 2011

Я работаю с библиографическими записями, в которых для разделения текста используются управляющие символы. Когда я использую имя символа Unicode «STRING TERMINATOR» в операциях замены, я получаю предупреждение «Malformed UTF-8», если текст содержит «Ü». Подстановка работает с другими именами символов Unicode и текстом, содержащим "ü", "ä", "é", ...

#!/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;
};

Я использую Strawberry Perl v5.12.3.0.

Что можно сделать, чтобы избежать этих предупреждений?

Спасибо, Джорол

Ответы [ 2 ]

1 голос
/ 13 июля 2011
0 голосов
/ 13 марта 2012

Если возможно, вы можете иметь список всех символов Юникода в хэше и подставлять его перед обработкой, чтобы избежать предупреждений о версии 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"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...