Russische Dateinamen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Das heisst du glaubst mir das ich ein problem habe und jetzt suchen wir noch eine Lösung

    Kommentar


    • #17
      Original geschrieben von Jeremias
      Das heisst du glaubst mir das ich ein problem habe ...
      Yep. ;-)
      Und zwar ein eher großes Problem.

      ... und jetzt suchen wir noch eine Lösung
      ... und das wird schwierig werden, weil es von den Bogus-Flaggern unter den PHP-Entwicklern nicht als Problem gesehen wird. Irgendwie ist das mal wieder typisch für diesen Klempnerladen:

      There are already feature requests for this. This is not a bug but
      missing feature. And this missing feature will be in PHP 6.
      (Quelle -- übrigens mit sehr sauberer Problembeschreibung)

      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, 20:11.
      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

      Kommentar


      • #18
        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.

        Kommentar


        • #19
          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


          • #20
            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.
            Yep. Eben ausprobiert. Allerhöchstens über die 8.3-Namen könnte man vielleicht rankommen.
            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.
            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? Deutsche Umlaute gehen ja schließlich auch. Wir haben 2009 und nicht 1969, und UTF-8 gibts seit reichlich 10 Jahren. Es geht auch nicht ums Verarbeiten, sondern nur ums "Durchreichen" von Unicode-Zeichen.

            --
            [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 (
            !== $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($line1, -2) : substr($line0, -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, 10:00.
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #21
              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?
              Was verwendest du, wenn es offenbar kein Windows oder *nix ist?

              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


              • #22
                Original geschrieben von h3ll
                Und wozu brauchen Dateien, die auf einem Server gespeichert werden, Sonderzeichen?
                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.

                Es gibt immer wieder Programm oder Skripte, die Probleme mit extravaganten Sonderzeichen haben.
                "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 ...

                Und was machst du, wenn du auf diese angewiesen bist?
                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.
                Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                Kommentar


                • #23
                  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


                  • #24
                    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.
                    In der Informatik sind sie was besonderes, auch wenn man das in manchen Grundschulen nicht lernt.

                    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 ...
                    Dem Computer sind die paar hundert Millionen Menschen aber sch***egal. Der rechnet immer noch mit Bits und Bytes, und nicht mit 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.
                    Wie gesagt gibts immer wieder Programme, die das eben nicht können. Und lieber gleich dafür sorgen, dass alles möglichst kompatibel gehalten wird, als irgendwann später draufkommen, dass es zu Problemen kommt und man alles wieder umändern muss.

                    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


                    • #25
                      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, 16:26.
                      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                      Kommentar

                      Lädt...
                      X