Das heisst du glaubst mir das ich ein problem habe und jetzt suchen wir noch eine Lösung
Russische Dateinamen
Einklappen
X
-
Original geschrieben von Jeremias
Das heisst du glaubst mir das ich ein problem habe ...
Und zwar ein eher großes Problem.
... und jetzt suchen wir noch eine Lösung
There are already feature requests for this. This is not a bug but
missing feature. And this missing feature will be in PHP 6.
Als Lösungsvorschläge hätte ich erstmal nur Perl, Python oder eine andere professionelle Script-Umgebung.Zuletzt geändert von fireweasel; 20.01.2009, 21:11.
Kommentar
-
Prinzipiell sollte man Sonderzeichen in Dateinamen überhaupt nicht verwenden bzw. beim Upload von Dateien einfach nicht zulassen oder automatisch eliminieren.
Vor allem unter Windows stößt man damit ständig auf Probleme und auch unter Linux können Sonderzeichen Schwierigkeiten machen. Und das jetzt völlig unabhängig von PHP.
Kommentar
-
Original geschrieben von PHP-Desaster
Scheint ja nur unter Windows-Systemen fehlerhaft zu sein, dann geht es ja grad noch. Ich wollte gerade vorschlagen, einfach über exec und dir etwas passendes nachzubauen, aber die Ausgabe von dir im Terminal ist genauso fehlerhaft. Sieht schlecht aus.
Dass "dir /B pfad" in der Kommandozeile bei Nicht-ISO-8859-1-Zeichen nur Fragezeichen ausgibt, ist aber auch schon eine Meisterleistung. ;-) Ist mir bisher noch nie aufgefallen.
Wenn man das CLI mit "cmd /U" startet, werden die Zeichen übrigens richtig dargestellt. Vielleicht kann man das ja einer der PHP-Exec-Funktionen beibiegen?
Ich hab mich jetzt noch auf die Suche nach Win32API-Extensions für PHP begeben. Damit hätte man ja notfalls opendir(), readdir() und closedir() nachbauen könne. Aber Fehlanzeige:
* WinBinder kennt keine Verzeichnisfunktionen
* w32api wird nicht mehr unterstützt (gabs wohl nur für PHP4)
* winstd kann ebenfalls keine Verzeichnisfunktionen
Eine Idee hätte ich noch -- aber da muss ich noch ein wenig "recherieren" (wird heute nichts mehr).
Prinzipiell sollte man Sonderzeichen in Dateinamen überhaupt nicht verwenden bzw. beim Upload von Dateien einfach nicht zulassen oder automatisch eliminieren.
--
[1] und was weiß ich, wer noch alles
----
Mahlzeit! ;-)
Zumindest das Auflisten der Verzeichniseinträge funktioniert:
PHP-Code:/// return list of directory entries
function dir_scan_unicode(
$path = NULL /// path to directory
) {
if (!is_dir($path)) {
return FALSE;
}
// entfernen|umbauen, worueber DIR stolpern koennte:
$path = preg_replace(
'/(?:\Afile:\/\/(localhost)?\/|\/)/Se',
'strlen("$0") > 1 ? "" : "\x5c"',
$path
);
// fuer CMD:
// /U Umstellen der Ausgabe auf UTF-16LE
// /C nach Aufruf des folgenden Kommandos sofort zurueckkehren
// fuer DIR:
// /B nur "long file names" anzeigen
// /C nach Aufruf des folgenden Kommandos sofort zurueckkehren
// fuer DIR:
// /B nur "long file names" anzeigen
exec('cmd /U /C dir ' . cmd_escape($path). ' /B', $lines, $return_val);
if (0 !== $return_val) { // 0 means success
return FALSE;
}
foreach ($lines as $line_key => $line) {
//* konvertiert UTF-16LE nach UTF-8
//
$lines[$line_key] = mb_convert_encoding(
(strlen($line) & 1) ? substr($line, 1, -2) : substr($line, 0, -2),
'UTF-8', // from encoding
'UTF-16LE' // to encoding
);
//*/
/* konvertiert UTF-16LE nach HTML-ASCII + NCR (&#dec-zahl;)
// Fuer die testweise Ausgabe (u.A. im Browser)
$codepoints = unpack(
'v*',
(strlen($line) & 1) ? substr($line, 1, -2) : substr($line, 0, -2)
);
foreach ($codepoints as $cp_key => $codepoint) {
$codepoints[$cp_key] = $codepoint > 127
? sprintf('&#%d;', $codepoint)
: chr($codepoint);
}
$lines[$line_key] = implode($codepoints);
//*/
// Leerzeilen entfernen (eigentlich nur die letzte)
if (!isset($lines[$line_key][0])) {
unset($lines[$line_key]);
}
}
return $lines;
}
// um Code-Injections zu verhindern
// escapeshellcmd() funktioniert nicht wie erwartet
function cmd_escape(
$path = NULL
) {
// implementation left to you as an exercise ;-)
return $path;
}
// getestete Pfade:
$path = 'f:\\test\\php-resource\\cyrillic-filename';
$path = 'f:\test\php-resource\cyrillic-filename';
$path = 'f:/test/php-resource/cyrillic-filename';
$path = 'file:///f:/test/php-resource/cyrillic-filename';
$path = 'file://localhost/f:/test/php-resource/cyrillic-filename';
foreach ($entries as $entry) {
echo '<br />', $entry, '';
}
Zuletzt geändert von fireweasel; 21.01.2009, 11:00.
Kommentar
-
Original geschrieben von fireweasel
Sonderzeichen? Warum sollten Russen, Ukrainer, Bulgaren, Serben, Mazedonier, Griechen u.w.w.i.w.n.a[1] nicht ihre Dateien mit ihren Buchstaben benennen können? Nur weil 'n paar engstirnige Windoze|*nix|PHP-Code-Klempner sich nicht vorstellen können, dass es außerhalb von ASCII auch noch andere Zeichen auf der Welt gibt?
Und wozu brauchen Dateien, die auf einem Server gespeichert werden, Sonderzeichen? Die Dateinamen werden vernünftigerweise in die Datenbank geschrieben und die echten Dateinamen sind einfach serialisierte Nummern oder ähnliches, um eben genau solchen Problemen (und anderen) aus dem Weg zu gehen.
Es gibt immer wieder Programm oder Skripte, die Probleme mit extravaganten Sonderzeichen haben. Und was machst du, wenn du auf diese angewiesen bist?
Kommentar
-
Original geschrieben von h3ll
Und wozu brauchen Dateien, die auf einem Server gespeichert werden, Sonderzeichen?
Nochmal: Es handelt sich um Buchstaben und nicht um Sonderzeichen. Nur weil manche Leute die nicht in der Grundschule kennengelernt haben, heißt das nicht, dass sie nicht existieren oder irgendwas "Besonderes" darstellen.
Es gibt immer wieder Programm oder Skripte, die Probleme mit extravaganten Sonderzeichen haben.
*facepalm*
Hast du schon mal was von Unicode gehört? Für ein paar Hundert Millionen Menschen sind das ganz gewöhnliche Buchstaben ...
Und was machst du, wenn du auf diese angewiesen bist?
Kommentar
-
Alles was mehr als 7, bzw. 8 Bit benötigt(und als Bitcode für einen Buchstaben benutzt wird), wird in der Informatik sehr oft als Sonderzeichen bezeichnet.
Da ein grosser Teil der Informatik in Ländern mit einem Lateinischen Alphabet seinen Anfang nahm wurden die ersten 127(255) Zeichen schon sehr früh von ihnen beansprucht, sprich alle in Folge hinzugefügten Zeichen wurden/werden als Sonderzeichen betrachtet.
Wieviele Menschen diese Zeichen benutzen oder wieviele von diesen Zeichen es gibt spielt dabei keine Rolle.
Kommentar
-
Original geschrieben von fireweasel
Es sprach auch niemand von Hochladen oder Speichern auf einem (Web-)Server. Es ging um simples Auflisten der Einträge eines Verzeichnisses mit Hilfe der Script-Sprache PHP -- nix CGI, nix Apache-Modul. Du vaschtähn, товарищ? ;-)
Nochmal: Es handelt sich um Buchstaben und nicht um Sonderzeichen. Nur weil manche Leute die nicht in der Grundschule kennengelernt haben, heißt das nicht, dass sie nicht existieren oder irgendwas "Besonderes" darstellen.
Original geschrieben von fireweasel
"extravagante Sonderzeichen"?
*facepalm*
Hast du schon mal was von Unicode gehört? Für ein paar Hundert Millionen Menschen sind das ganz gewöhnliche Buchstaben ...
Original geschrieben von fireweasel
Zu einer Programmierumgebung wechseln, die damit umgehen kann. Die Betriebssysteme der Windows-NT-Familie können (seit Jahren) mit solchen Pfaden umgehen, da sollte man erwarten können, dass darauf aufsetzende Layer diese Fähigkeiten zumindest durchreichen können.
Was Computer können und was Menschen können sind oft ein unterschiedliches paar Schuhe. Versuch zB. mal unter Windows in Notepad eine Datei mit dem Namen "con.txt" abzuspeichern...
Ein anderes Problem ist die Groß-/Kleinschreibenung. Für jeden Menschen ist klar, dass 'A' was anderes als 'a' ist. Warum sollte man also nicht eine Datei 'baum.doc' und eine andere Datei 'Baum.doc' im selben Verzeichnis abspeichern können? Sind ja unterschiedliche Buchstaben. Tja, nur blöd, dass das Windows anders sieht.
Kommentar
-
So, bevor ich jetzt auf die "Informatik(er)"-Argumente eingehe und sie in der Luft zerreiße [1] ...
... es geht. Ich habe ein Script zusammengeschraubt, das mit Unicode-Buchstaben in Pfaden umgehen kann. Der PHP-Teil kommt sogar ohne Multibyte-Erweiterung oder ähnlichen Kram aus -- das war auch eigentlich nie nötig, es muss ja nur UTF-8 "durchgeschleift" werden. Aber sag das mal einer den PHP-Entwicklern.
Die Realisierung bleibt allerdings auf WindozeXP (und kompatible[3]) beschränkt. Ein wichtiger Grund dafür ist, dass das Bearbeiten von Dateien mit solchen Pfaden über fopen(), fread() etc. möglich sein soll. Diese Funktionen können aber wie die Verzeichnis-Funktionen nicht mit Unicode-Teil-Pfaden umgehen. NTFS unter Windows ermöglicht aber das Verwenden von "kurzen Pfad(nam)en" in der antiken 8.3-Notation -- mit denen kann auch PHP.
Jetzt warte ich noch auf jemand, der das auch für Pinguin-Systeme hinbiegt.
Ich muss das Ganze nur noch in eine Form[2] bringen, die man auch veröffentlichen kann.
--
[1] War nur Spaß. ;-)
[2] Eine PHP-Klasse.
[3] Rein theoretisch müsste sogar Windoze95 mit installiertem Unicode-Layer funktionieren.Zuletzt geändert von fireweasel; 26.01.2009, 17:26.
Kommentar
Kommentar