Krótka odpowiedź: dodaj użytek utf8; aby upewnić się, że Twój ciąg literowy w kodzie źródłowym jest interpretowany jako utf8, który zawiera treść ciągu testowego i treść wyrażenia regularnego.
Długa odpowiedź:
#!/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");
Wykonywanie go bez 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
Wykonanie go z 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
wyjaśnienie:
The znaki spoza ASCII ty Ponowne wpisanie kodu źródłowego jest reprezentowane przez jeden lub więcej bajtów. Ponieważ twoje wejście jest zakodowane utf8. W czystym terminalu ASCII lub Latin-1 znaki byłyby jednym bajtem.
Gdy nie używa się modułu utf8, perl uważa, że każdy wprowadzany bajt jest oddzielną postacią, jak widać podczas dzielenia i drukowania każdego indywidualnego znaku. Podczas korzystania z modułu utf8 traktuje kombinację kilku bajtów jako jeden znak poprawnie zgodnie z zasadami kodowania utf8.
Jak widać na podstawie liczby monet, niektóre z bajtów, które składają się na szwedzkie znaki, składają się z niektórych bajtów, z których składa się część znaków w łańcuchu testowym, i są one przechowywane. Mianowicie: ö, który w utf8 składa się z 195: Ã 164: ¤ - 164 kończy się jako jedna z dozwolonych przez ciebie postaci i przechodzi przez nią.
Rozwiązaniem jest poinformowanie perla, że twoje struny mają być uważane za utf-8.
Dostępne są wywołania encode_utf8 w celu uniknięcia ostrzeżeń o szerokich znakach drukowanych na terminalu. Jak zwykle, musisz dekodować wejście i kodować wyjście zgodnie z kodowaniem znaków, które wejście lub wyjście ma obsługiwać/obsługiwać.
Mam nadzieję, że dzięki temu stało się jaśniejsze.
Z którą wersją perla pracujesz? Wsparcie dla Unicode było stopniowo dodawane i ulepszane. Spróbuj pracować z co najmniej 5,12 i spójrz na odpowiedź choroby. 'perl -v', aby wydrukować wersję. [Podręcznik perl unicode] (http://perldoc.perl.org/perlunicode.html) – cfi
Wersja jest w wersji 5.12.4 – Pithikos
Dlaczego doświadczeni programiści ciągle zmieniają pytania? Teraz żaden użytkownik mojego (niskiego) doświadczenia nigdy nie znajdzie odpowiedzi na swoje pytanie. – Pithikos