Hi Stefan,
der Webserver kommuniziert mit Perl über STDIN, STDOUT, das ist der Common Gateway im Sinne CGI. Auf diesem Gateway gilt die Bytesemantics, um diese sicherzustellen, setze mal:
binmode STDIN;
binmode STDOUT;
in Deinem Perlscript. Evntl. ändert das was. Deine Konsole setzt ebenfalls die Bytesemantics durch, denn Ausgabe ist IO und da gilt Bytesemantics. Was Deine Konsole diesbez. macht kannst Du testen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use warnings;
binmode STDIN;
binmode STDOUT;
printf("Oktetten ä: %s\n", pack("CC", 0xC3, 0xA4));
print "Lese aus der Pipe:\n";
while( read(STDIN, my $bin, 1)){
printf "%X\n", unpack("C", $bin);
}
C:\Users\49162\Desktop>echo ä| perl pack.pl
Oktetten ä: ä
Lese aus der Pipe:
84
D
A
wobei 0xD, 0xA die Bytes für das Ende der Eingabe sind. Das 'ä' selbst wird als ein Byte mit der Wertigkeit 0x84 (dezimal 132) gelesen, UTF-8 ist das nicht sondern Codepage 850.
Guck doch mal wie das bei Dir aussieht.
PS: UTF-8 in der Windows-CMD geht übrigens so:
C:\Users\49162\Desktop>mode con: cp select=65001
Status von Gerät CON:
---------------------
Zeilen: 9001
Spalten: 120
Wiederholrate: 31
Verzögerungszeit:1
Codepage: 65001
Und danach sieht Ergebnis meines Scripts so aus:
C:\Users\49162\Desktop>echo ä|perl pack.pl
Oktetten ä: ä
Lese aus der Pipe:
C3
A4
D
A
Wenn wir das haben, können wir sicher sein daß bei einer Eingabe über die Console auch die richtigen utf-8-kodierten Oktetten im Script ankommen.
Last edited: 2023-07-27 16:54:24 +0200 (CEST)