Risposta breve: aggiungere utilizzare utf8; per assicurarti che la tua stringa letterale nel codice sorgente sia interpretata come utf8, che includa il contenuto della stringa di test e il contenuto della regexp.
Risposta lunga:
#!/usr/bin/env perl
use warnings;
use Encode;
my $word = 'cɞi¤r$c❤u¨s';
foreach my $char (split //, $word) {
print ord($char) . Encode::encode_utf8(":$char ");
}
my $allowed_chars = 'a-zöäåA-ZÖÄÅ';
print "\n";
foreach my $char (split //, $allowed_chars) {
print ord($char) . Encode::encode_utf8(":$char ");
}
print "\n";
$word =~ s/[^$allowed_chars]//g;
printf Encode::encode_utf8("$word\n");
esecuzione senza utf8:
$ perl utf8_regexp.pl
99:c 201:É 158: 105:i 194:Â 164:¤ 114:r 36:$ 99:c 226:â 157: 164:¤ 117:u 194:Â 168:¨ 115:s
97:a 45:- 122:z 195:Ã 182:¶ 195:Ã 164:¤ 195:Ã 165:¥ 65:A 45:- 90:Z 195:Ã 150: 195:Ã 132: 195:Ã 133:
ci¤rc¤us
esecuzione con utf8:
$ perl -Mutf8 utf8_regexp.pl
99:c 606:ɞ 105:i 164:¤ 114:r 36:$ 99:c 10084:❤ 117:u 168:¨ 115:s
97:a 45:- 122:z 246:ö 228:ä 229:å 65:A 45:- 90:Z 214:Ö 196:Ä 197:Å
circus
Spiegazione:
I caratteri non ASCII tu a La reinserzione nel codice sorgente è rappresentata da uno più byte. Dal momento che il tuo input è codificato utf8. In un puro ASCII o terminale latino-1 i caratteri sarebbero stati un byte.
Quando non si utilizza il modulo utf8, perl pensa che ogni singolo byte che si sta inserendo è un carattere separato, come si può vedere quando si esegue la divisione e la stampa di ogni singolo carattere. Quando si utilizza il modulo utf8, tratta la combinazione di più byte come un carattere correttamente secondo le regole della codifica utf8.
Come si può vedere da coinscidence, alcuni dei byte che i caratteri svedesi sono costituiti da corrispondere con alcuni dei byte che alcuni dei caratteri nella stringa di prova sono costituiti, e sono mantenuti. Vale a dire: il ö che in utf8 consiste di 195: Ã 164: ¤ - Il 164 finisce come uno dei personaggi che permetti e passa attraverso.
La soluzione è di dire perl che le tue stringhe dovrebbero essere considerate come utf-8.
Le chiamate encode_utf8 sono attive per evitare avvisi relativi ai caratteri ampi stampati sul terminale. Come sempre, è necessario decodificare l'input e codificare l'output in base alla codifica dei caratteri che l'input o l'output deve gestire/utilizzare.
Spero che ciò sia reso più chiaro.
Con quale versione stai lavorando? Il supporto Unicode è stato gradualmente aggiunto e perfezionato. Prova a lavorare con almeno 5.12, e guarda la risposta di Choroba. 'perl -v' per stampare la versione. [Manuale per per unicode] (http://perldoc.perl.org/perlunicode.html) – cfi
La versione è v5.12.4 – Pithikos
Perché i programmatori esperti continuano a cambiare le domande? Ora nessun utente della mia (scarsa) esperienza troverà mai la risposta alla sua domanda. – Pithikos