hallo
Hallo ihrs,
willkommen im Windows Codepage-Chaos. Ich habe KEINE Ahnung, welche Namenscodierung NTFS verwendet, aber es scheint voll Unicode-kompatibel zu sein, weil man sogar ein 😀 Emoji in einen Dateinamen setzen kann. Auf der Befehlszeile rafft er DAS allerdings nicht, ein DIR Befehl zeigt statt des Emoji zwei Kästchen.
Nimmt man etwas weniger exotisches aus der BMP, z.B. kyrillisch Л, kann ein DIR Befehl es anzeigen und ein type-Befehl auf der Kommandozeile die Datei auch auslesen. In einer CMD-Datei allerdings klappt das nicht - es sei denn ich verwende Codepage 866 für das Encoding der Datei und setze vorher noch CHCP 866 ab.
Das Euro-Zeichen ist in der Codepage 850 (Standard-Commandline Codepage, auch heute noch) undefiniert. In der Codepage 858 ist es \xD5, in der Windows Codepage 1252 ist es \x80. Interessante Frage wäre also nun: Wenn Du den Namen mit dem € drin nach Perl eingelesen hast, welchen Hex-Code hat das € da? \xD5, \x80, \x20 \xAC oder 0xE2 0x82 0xAC? Das sind die Codierungen in CP858, CP1252, UTF-16 und UTF-8.
Meine 5 Cent liegen auf \xD5.
Also der aktuelle Code
if( $file =~ /\.(?:$filetypes)$/ && -f $file && -r $file ){
$list.= encode("utf8", decode("iso-8859-1",
sprintf(qq{<option value="%s/%s">%s/%s [%s]</option>\n},
$f, $_ , $f, $_ ,
( -w $file ? $mode : '+r')
)));
}
Das wird also als HTML UTF-ausgegeben und ich kann diese URL dann aktivieren.
Im <input> lese ich zuerst: /html/pub/äöüçé.txt
Wenn ich dann ein XHR GET ausführe wird auch URI:encode angewedet und ich lese:
http://localhost/html/pub/%C3%A4%C3%B6%C3%BC%C3%A7%C3%A9%C2%80.txt NOT FOUND
Schuld ist hier das Euro-zeichen.
##Nächster Versuch: diesmal CP1252 statt "iso-8859-1"
Resultat:
<input> zeigt: /html/pub/äöüçé€.txt
Nach eine XHR Get
http://localhost/html/pub/%C3%A4%C3%B6%C3%BC%C3%A7%C3%A9%E2%82%AC.txt OK
Das heisst: CP1252 ist korrekt auf meinem Windows-System.
Danke.