Portál AbcLinuxu, 8. května 2025 06:42
/\w/
"nesežere" některé znaky s diakritikou
v kódování UTF8.
Příklad:
#!/usr/bin/perl -w
use utf8;
use locale;
use encoding 'utf-8';
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
print "ě>$1<\n" if "ě" =~ /(\w)/;
print "š>$1<\n" if "š" =~ /(\w)/;
print "č>$1<\n" if "č" =~ /(\w)/;
print "ř>$1<\n" if "ř" =~ /(\w)/;
print "ž>$1<\n" if "ž" =~ /(\w)/;
print "ý>$1<\n" if "ý" =~ /(\w)/;
print "á>$1<\n" if "á" =~ /(\w)/;
print "í>$1<\n" if "í" =~ /(\w)/;
print "é>$1<\n" if "é" =~ /(\w)/;
Výraz /(\w)/
projde jenom pro ě,š,č,ř,ž
locales mám nastaveno na:
LANG=cs_CZ.UTF-8
LC_CTYPE="cs_CZ.UTF-8"
LC_NUMERIC="cs_CZ.UTF-8"
LC_TIME="cs_CZ.UTF-8"
LC_COLLATE="cs_CZ.UTF-8"
LC_MONETARY="cs_CZ.UTF-8"
LC_MESSAGES="cs_CZ.UTF-8"
LC_PAPER="cs_CZ.UTF-8"
LC_NAME="cs_CZ.UTF-8"
LC_ADDRESS="cs_CZ.UTF-8"
LC_TELEPHONE="cs_CZ.UTF-8"
LC_MEASUREMENT="cs_CZ.UTF-8"
LC_IDENTIFICATION="cs_CZ.UTF-8"
LC_ALL=
Někde jsem našel řešení něco jako /(\p{L})/
,
ale nikde jsem se nedočetl co to přesně znamená a proč to původní řešení nefunguje přestože je to uvedeno v mnoha návodech.
Díky za odpovědi
/(\p{L})/
nespolkne číslice, potřeboval bych něco na alfanumerický znaky.
#!/usr/bin/perl use strict; use warnings; use utf8; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; my $string = "Čeština je ČESKÁ"; $string =~ /(\w+)/; my ($result) = ($1); print "Hledam v $string\n"; print "Nalezeno $result\n"; print "Čeština je cool!\n" if $result eq "Čeština";Moje locales:
mira@batman:~$ env|grep LANG LANG=en_US.UTF-8
perl -e "use locale; print 'Yep' if ('ý' =~ /\w/)" YepOS X 10.5.2, Perl 5.8.8, locale
en_US.UTF-8
. Možná zkus nastavit ještě LC_ALL
?
doinstaloval jsem nejaky baliky, uz nevim ktery presne zabral:
language-pack-cs
language-gnome-cs
language-support-cs
language-translate-cs
reinstaloval jsem locale
sudo apt-get install --reinstall locales
a potom to zaclo fungovat:
LC_ALL=en_US.UTF-8 perl -C -Mutf8 -e '$_="aábcčdďeěéfghiíjklmnňoópqrřsštťuúůvwxyýzž"; s/\W/-/g; print $_, "\n"'
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.