1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ perl -wE'
my $s = "Ö";
my $regex = "ö";
say 1 if $s =~ m/$regex/i'
$ perl -wE'
use utf8; # strings direkt im skript werden automatisch dekodiert
my $s = "Ö";
my $regex = "ö";
say 1 if $s =~ m/$regex/i'
1
$ perl -wE'
use Encode; # manuelles dekodieren von variablen
my $s = decode_utf8 "Ö";
my $regex = decode_utf8 "ö";
say 1 if $s =~ m/$regex/i'
1
2013-06-02T16:51:55 technix@GwenDragon: Ich verwende keine locale und kaum module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@gwendragon ~ # locale; perl -E "say (('Testä' =~ /ä/i) ? 'Match' : 'NOMatch')"
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Match
root@gwendragon ~ # perl -E "say (('Testä' =~ /Ä/i) ? 'Match' : 'NOMatch')"
NOMatch
1 2
perl -e "print (('Testä' =~ /Ä/i) ? 'Match' : 'NOMatch')" perl -e "print (('Testä' =~ /ä/i) ? 'Match' : 'NOMatch')"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#! /usr/bin/perl use strict; use warnings; use Data::Dumper; use utf8; my $file = shift || die "no input file given."; my $re_suche = qr{[äöü]}i; # ohne ":encoding(...)" gibt es keinen Match open my $fh, '<:encoding(UTF-8)', $file or die "open '$file' failed: $!\n"; while ( my $l = <$fh> ) { if ( $l =~ $re_suche ) { print " Match\n"; } else { print "NoMatch\n"; } } close $fh;
Hallo Wörld.
1 2 3 4 5 6 7 8 9 10
use Encode qw(encode decode); $enc = 'utf-8'; ... $in{'bez'} = decode($enc, $in{'bez'}); if ($feld[6] =~ m/$in{'bez'}/i) { ....... # # $feld[6] ist ein Teil der zeilenweise ausgelesenen Datei # in $in{'bez'} steht per cgi übergeben, was ich finden will # alles funzt problemlos, ö und Ö werden gefunden, nur der # modifier 'i' m/$in{'bez'}/i weigert sich 'case ignoring' # zu arbeiten.
open(MYTEXT, "<:encoding(UTF-8), $infile") || die "Datei verstorben"
1 2 3 4
my $infile = '/tmp/bla.txt'; open my $infh, '<', $infile or die "open(ro,$infile) failed: $!"; # ... close $infh;
QuoteStellt sich die Frage: Liefert der Server UTF-8 als charset aus, was steht als charset im HTML-Head?das ging problemlos, aber bewirkt, daß die Daten im browser nicht mehr richtig (sondern mit den schwarzen Vierecken) ausgegeben werden.
2013-06-03T17:00:43 technixIch hab probiert, die Textdatei jetzt UTF-8 codiert einzulesen, das ging problemlos, aber bewirkt, daß die Daten im browser nicht mehr richtig (sondern mit den schwarzen Vierecken) ausgegeben werden.
Quotenur das von pq empfohlene Devel::Peek mag mich nicht, das geht wohl im Perl-Editor 'daheim' aber online liefert es keine Ergebnisse, das mag auch an der browsr Ausgabe liegen. Auch hier experimentere ich noch.
2013-06-03T17:00:43 technixwenn ich am Anfang des Skripts das Pragma use utf8; setze, dann verschwinden die Umlaute aus meiner Suchvariablen (ich lasse mir die vor dem Start der Suche noch anzeigen). Das habe ich also auch sofort wieder entfernt.
binmode STDOUT, ':encoding(UTF-8)';
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
#!/usr/bin/perl -w use CGI::Carp qw( fatalsToBrowser ); use Encode qw(encode decode); $enc = 'utf-8'; $infile = "bb.txt"; $in{'bez'}="Rad"; ¶m_in; print qq*Content-type: text/html; charset=utf-8\n <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <form method="GET" action="bb.pl" name="ArtSuch" accept-charset="UTF-8"> <input type="hidden" name="dummyChar" value="♥" /> <!--wegen IE utf-8 problem--> Bitte nach deutschen Umlauten (groß/kleingeschrieben) suchen<br> Suchtext <input name="bez" size="10" value="" maxlength="3" type="text"></form>*; print "gesucht wird: $in{'bez'}<br><br>Ergebnis:<br>"; if (-T $infile) { open(ZEUG, "<$infile") || die "keine Textdatei\n";} while(<ZEUG>) { $testline=$_; if ($testline =~ m/$in{'bez'}/i) { print "$testline <-- ich hab ein "$in{'bez'}" gefunden!<br>"; } else { print "$testline<br>"; } } print qq*<br>Eine Suche nach F findet alle 3 F (groß und klein)<br> leider ist das bei den Umlauten nicht so"*; exit(0); #---------------------------------------------- sub param_in { if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; } else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } @nvpairs = split(/&/,$buffer); foreach $pair (@nvpairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#!/usr/bin/perl use strict; use warnings; use utf8; # script beinhaltet direkt utf8 use CGI::Carp qw( fatalsToBrowser ); use CGI; use Encode qw(encode decode); my $enc = 'utf-8'; my $cgi = CGI->new; my $infile = "bb.txt"; my $bez = decode($enc, $cgi->param('bez')) || "Red"; # zur Ausgabe wieder kodieren binmode STDOUT, ':encoding(UTF-8)'; print <<"EOM"; Content-type: text/html; charset=utf-8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <form method="GET" action="bb.pl" name="ArtSuch" accept-charset="UTF-8"> <input type="hidden" name="dummyChar" value="♥" /> <!--wegen IE utf-8 problem--> Bitte nach deutschen Umlauten (groß/kleingeschrieben) suchen<br> Suchtext <input name="bez" size="10" value="" maxlength="3" type="text"></form> EOM print "gesucht wird: $bez<br><br>Ergebnis:<br>"; -T $infile or die "$infile not an ASCII file"; open my $fh, "<:encoding(UTF-8)", $infile or die "keine Textdatei: $!"; while (my $testline = <$fh>) { if ($testline =~ m/$bez/i) { print "$testline <-- ich hab ein "$bez" gefunden!<br>"; } else { print "$testline<br>"; } } print qq*<br>Eine Suche nach F findet alle 3 F (groß und klein)<br> leider ist das bei den Umlauten nicht so"*; exit(0);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
use utf-8; # zwingend erforderlich, in utf-8 zu scripten allein # ist zuwenig. use Encode qw(encode decode); $enc = 'utf-8'; $in{'suchmich'} = decode($enc, $in{'suchmich'}); # # decodieren aller relevanten von 'außen' übergebenen # Variablen, da perl intern utf-8 leider nicht versteht open my $fh, "<:encoding(UTF-8)", $infile # # einlesen externer Textdaten als utf-8, auch wenn diese # schon utf-8 sind # und vor der ersten Ausgabe in Dateien oder als HTML binmode STDOUT, ':encoding(UTF-8)';
2013-06-04T10:57:45 technixCode (perl): (dl )1 2 3use utf-8; # zwingend erforderlich, in utf-8 zu scripten allein # ist zuwenig.
QuoteCode (perl): (dl )1 2 3 4 5use Encode qw(encode decode); $enc = 'utf-8'; $in{'suchmich'} = decode($enc, $in{'suchmich'}); # # decodieren aller relevanten von 'außen' übergebenen # Variablen, da perl intern utf-8 leider nicht versteht
QuoteCode (perl): (dl )1 2 3 4open my $fh, "<:encoding(UTF-8)", $infile # # einlesen externer Textdaten als utf-8, auch wenn diese # schon utf-8 sind
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
perl -wE'
use Encode;
use Devel::Peek;
my $bytes = "ä ö ü";
my $chars = decode_utf8("ä ö ü");
my $latin1 = encode(latin1 => $chars);
Dump $bytes;
Dump $chars;
Dump $latin1;
'
# $bytes
SV = PV(0x850b78) at 0x86fc20
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x86a4e0 "\303\244 \303\266 \303\274"\0
CUR = 8
LEN = 16
# $chars
SV = PV(0x851228) at 0x86fc68
REFCNT = 1
FLAGS = (PADMY,POK,pPOK,UTF8)
PV = 0x8a9d00 "\303\244 \303\266 \303\274"\0 [UTF8 "\x{e4} \x{f6} \x{fc}"]
CUR = 8
LEN = 16
# $latin1
SV = PV(0x8514e8) at 0x86fc08
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV = 0x94e9b0 "\344 \366 \374"\0
CUR = 5
LEN = 8