Ankündigung

Einklappen
Keine Ankündigung bisher.

Copy mit Sonderzeichen

Einklappen

Neue Werbung 2019

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

  • Copy mit Sonderzeichen

    Hallo, ich hab eine Problem mit Sonderzeichen in Dateinamen beim benutzen des copy Befehls. Hab keine Infos dazu gefunden bzw scheint das mit den Umlauten einfach nicht zu funktionieren. Deswegen wollte ich hier nochmal nachfragen ob dem wirklich so ist. Ich habe ein paar Mp3-Files welche im Titel manchmal Sonderzeichen wie zb "ѓ" haben. Ich möchte die Mp3 nun via PHP verschieben, was bei allen Files ohne Sonderzeichen auch funktioniert. Ich kann mir nun nicht vorstellen das das mit PHP nicht funktionieren soll da die Zeichen ja im Windows-Explorer auch korrekt dargestellt werden.
    Hier mal mein Code:

    PHP-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link type="text/css" href="css/pos.css" rel="stylesheet" media="screen" />

    </head>
    <body>
    <?php
    header
    ("content-type: text/html; charset=UTF-8");

    include(
    "move.php");
    include(
    "move_folder.php");
    include(
    "del_files.php");
    include(
    "del_folder.php");

    $directory '../dl';
    $zielverzeichnis '..\\mp3';


    $file = array();
    $folder = array();
    $source = array();
    $z=0;


    $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));

    $it->rewind();
    while(
    $it->valid()) {

        if (!
    $it->isDot()) {
        
        
    //    echo 'SubPathName: ' . $it->getSubPathName() . "<br>";
        //    echo 'SubPath:     ' . $it->getSubPath() . "<br>";
        //    echo 'Key:         ' . $it->key() . "<br><br>";
            
    $folder[] = $it->getSubPath();
            
    $file[] = $it->key();
        }

        
    $it->next();
    }


    if(
    count($file) > 0)
    {

    echo 
    "Im Verzeichnis '$directory' wurden ".count($file)." Dateien in ".count(array_unique($folder))." Ordnern gefunden...<br><br>";


    while(
    $z<count($file))
    {

    //echo $file[$z]."<br>";
    //$zziel = str_replace("\\", "/", $file[$z]);

    //setlocale(LC_CTYPE, 'cs_CZ');

    $file[$z] = htmlentities($file[$z], ENT_QUOTES"Windows-1252");
    //$file[$z] = iconv("UTF-8", "ASCII//TRANSLIT", $file[$z]);
    $file[$z] = html_entity_decode($file[$z], ENT_QUOTES "utf-8");


    $ziel1 explode("\\"$file[$z]);
    $ziel "..\\dl\\".$ziel1[1]."\\".end($ziel1);
    $source[] = "..\\dl\\".$ziel1[1];
    //$ziel = str_replace("\\", "/", $ziel);

    //echo "Zielverzeichnis-->$ziel<br>";



    ///////////////********************* Alle Datein aus Unterordner holen

    echo "Dateiname: ".$file[$z]."<br>";

    if(
    move($file[$z], $ziel))
    {
    echo 
    "Datei ".$file[$z]." erfolgreich nach '$ziel' verschoben<br>";
    }
    else
    {
    echo 
    "Keine Dateien zum verschieben! Alle Dateien liegen im Verzeichnis '$source[$z]'<br>";
    }
    }
    }

    Die move.php in welcher sich die Funktion zum verschieben befindet sieht folgendermaßen aus:
    PHP-Code:
    <?php

    function move($from$to){ 
       
    //file_exists() - Existenz der Datei prüfen 
       
       
    if(!file_exists($to)){ 
          
    //copy() - Datei kopieren 
          
    if (!copy($from$to)) { 
             print (
    "Datei $from konnte nicht kopiert werden...(Sonderzeichen??)<br>\n");
             
    $error=1;
             
    //echo "Datei ".$from." erfolgreich nach '$to' verschoben<br>"; 
             
    return false;
          } 
          else{ 
             
    //unlink() - Datei löschen 
             
    unlink($from);
             return 
    true
          } 
       } 


    ?>
    An dem vielen auskommentierten sieht man das ich schon verschiedenes probiert hab. Hoffe jmd kann mir dazu nen Tipp geben.

    gruß ehorn

  • #2
    Ich könnte mir vorstellen, daß es am Encoding liegt.
    Hast Du mal ausgeben lassen, wie der Dateiname von PHP ausgelesen wird und ob das mit dem im echten Dateisystem übereinstimmt?
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Sorry weiß nicht ob ich das richtig verstehe. Meinst du so?
      PHP-Code:
      echo "Zeichensatz: ".mb_detect_encoding($file[$z])."<br>"
      Das würde die Ausgabe "Zeichensatz: ASCII" erzeugen. Somit wäre das wohl der Grund oder?
      Wie kann ich das ändern?

      Kommentar


      • #4
        Naja prüf doch erstmal, was Du als Werte in dem Iterator hast. Vielleicht erkennst Du da ja schon, ob er die Sonderzeichen da vielleicht schon fehlerhaft eingelesen hat.
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Dachte das mach ich mit dem oben angegebenen Code?! Meinst du ich sollte die auskommentierte Zeile "echo 'Key: ' . $it->key() . "<br><br>";" ausgeben lassen? Ich will dir nicht zu Nahe treten aber vlt kannst du mir ja einen Tipp geben was du meinst bevor wir uns hier noch mit weiteren 240 Antworten\Fragen im Kreis drehen!?

          gruß ehorn

          Kommentar


          • #6
            Mach doch einfach mal direkt nach dem Initialisieren des Iterators ein var_dump drauf:
            PHP-Code:
            $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
            var_dump$it ); 
            wenn die besagten Zeichen darin korrekt aussehen, weißt Du zumindest schonmal, daß er sie vermutlich mit dem korrekten Encoding einliest.
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Zitat von ehorn Beitrag anzeigen
              Hallo, ich hab eine Problem mit Sonderzeichen in Dateinamen beim benutzen des copy Befehls. …

              PHP-Code:
              <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
              <html xmlns="http://www.w3.org/1999/xhtml">
              <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <link type="text/css" href="css/pos.css" rel="stylesheet" media="screen" />

              </head>
              <body>
              <?php
              header
              ("content-type: text/html; charset=UTF-8");
              Moin,

              das geht so erstmal nicht. Du kannst keine HTTP-Header senden nachdem bereits etwas an den Client ausgegeben wurde was kein HTTP header ist.

              error_reporting und display_errors bitte koorekt einstellen!

              Nun zum Problem.

              Pfade mit Zeichen ausserhalb ASCII sind in PHP auf Windows systemen leider ein Problem!

              Das liegt aber nicht an Windows. Dessen Dateisystem Benamsung ist utf-16 und folglich für alle eventualitäten gerüstet. Das Problem liegt vielmehr bei PHP und dessen Umgang mit dem Windows Dateisystem, und dazu gibt auch Bugreports. Heilung könnte ab PHP 6 in Sicht sein.

              Es wär also sinnvoll wenn Du auf solche Dateinamen verzichtest. Wenn Du das nicht kannst/willst must Du zuerst rausfinden welche Kodierung zu nutzen ist (Deutsche Systeme nutzen z.B. Windows-1252 was nicht mit einem der ISO-8859-* gleichzusetzen ist)

              Also dann unter deutschen Windows Systemen den Dateinamen nach Windows-1252 umwandeln und hoffen das es so ausreicht

              Windows in anderen Sprachen nutzt hier aber u.U. andere Kodierungen!

              $path = iconv( 'UTF-8', 'Windows-1252//TRANSLIT', $path );

              Das darfst Du aber auf anderen nicht Windows system nicht machen sonst gehts dort schief.

              Gruß, Ulf
              PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

              Kommentar


              • #8
                Um das mit der Dateisystemcodierung in PHP unter Windows nochmal etwas genauer zu erklären:

                Auf unixoiden Systemen (Linux, Mac, etc.) wird die aktuelle Dateisystem Kodierung in LC_CTYPE hinterlegt.
                PHP arbeitet automatisch mit der dort hinterlegten Kodierung bei Dateisystem Operationen.

                Unter Windows macht PHP das total anders. Die in UTF-16 vorliegenden Pfade werden in PHP in eine andere Kodierung konvertiert, die abhängig von der eingestellten Systemsprache für Unicode inkompatible Programme ist. Das ist aber nur eine Krücke dafür das PHP eben nicht mit UTF-16 in allen nötigen Bereichen umgehen kann.

                Wenn man über Systemsteuerung > Region > Reiter: Verwaltung
                bei "Sprache für Unicode-inkompatible Programme" schaut, steht siche bei den meisten hier "Deutsch …" als ausgewählte Sprache. Deren Kodierung (Deutsch => Windows-1252 <= Codepage 1252) nutzt PHP fälschlicher Weise als LC_CTYPE weil es eben nicht mit utf-16 kann.

                Nun ist ja klar das eine Kodierung mit weniger Zeichenumfang nicht die selben Informationen darstellen kann wird UTF-16 mit sehr weitreichenden Zeichenumfang. Folglich wird zur Konvertierung das Unicode Mapping "best fit" für Windows codepages zu Hilfe genommen:

                http://www.unicode.org/Public/MAPPIN...indowsBestFit/

                Eigentlich ist das ziemlich grusselig…

                Wenn man also nicht gerade gezwungen ist PHP für Windows System zu bauen sollte man auch die Entwicklungsumgebung gleich auf Linux einrichten. :-/

                Wer mehr Details haben will, hier ein passender Bugreport.

                https://bugs.php.net/bug.php?id=47096

                Gruß, Ulf
                PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                Kommentar


                • #9
                  Zitat von Arne Drews Beitrag anzeigen
                  Mach doch einfach mal direkt nach dem Initialisieren des Iterators ein var_dump drauf:
                  PHP-Code:
                  $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
                  var_dump$it ); 
                  wenn die besagten Zeichen darin korrekt aussehen, weißt Du zumindest schonmal, daß er sie vermutlich mit dem korrekten Encoding einliest.
                  Hallo, ein var_dump gibt mir folgendes aus:
                  Code:
                  object(RecursiveIteratorIterator)#1 (0) { }
                  PHP-Code:
                  ...
                  $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
                  var_dump($it);
                  $it->rewind();
                  while(
                  $it->valid()) {

                      if (!
                  $it->isDot()) {
                      
                          
                  $folder[] = $it->getSubPath();
                          
                  $file[] = $it->key();
                      }

                      
                  $it->next();
                  }
                  ... 
                  @Ulfikado

                  das mit dem Header versteh ich nicht? Ich geb doch davor gar nix aus oder seh ichs nur nicht?
                  Error-Reporting hab ich vergessen..habs nachgeholt gibt aber keinen Fehler. Code sieht jetzt wie folgt aus...

                  PHP-Code:
                  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                  <html xmlns="http://www.w3.org/1999/xhtml">
                  <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


                  </head>
                  <body>
                  <?php
                  header
                  ("content-type: text/html; charset=UTF-8");
                  error_reporting(E_ALL);
                  ...
                  Deine Ausführung zur Codierung sind sehr interessant, könnte ich mittels iconv das Problem in den Griff bekommen? An welcher Stelle müsste das denn eingebaut werden?

                  gruß und danke für die Geduld
                  ehorn

                  Kommentar


                  • #10
                    das mit dem Header versteh ich nicht? Ich geb doch davor gar nix aus oder seh ichs nur nicht?
                    Das HTML außerhalb des PHP-Bereich ist eine Ausgabe. Es gibt zwar diese Einstellung…

                    - http://php.net/manual/en/outcontrol.configuration.php

                    …, die bei dir vielleicht auf „on“ steht, aber du solltest dennoch darauf achten, mit deinen Headern durch zu sein, bevor du mit Ausgaben beginnst.

                    Zitat von Ulfikado
                    Heilung könnte ab PHP 6 in Sicht sein.
                    Das wurde allerdings eingestampft. Das ist leider auch irgendwie das Problem mit den Infos zu dem Thema, die man so im Web findet. Die sind alle mehr oder weniger von 2009. Selbst auf den Dokuseiten zu fopen und dergleichen findet man nahezu nichts.

                    Weil man es manchmal liest: Es hängt eigentlich nicht daran, dass PHP „kein Unicode kann“ (was auch gar nicht stimmt). Irgendwas passt wohl mit der Windows-Version einer Bibliothek nicht, die PHP nutzt, um mit dem Dateisystem zu „kommunizieren“. Aus irgendeinem Grund reicht die die Dateinamen nicht einfach byteweise durch oder so, sondern mappt irgendwas um.

                    Also dann unter deutschen Windows Systemen den Dateinamen nach Windows-1252 umwandeln und hoffen das es so ausreicht
                    Tut es leider schon bei "ŕ" nicht.

                    Kommentar


                    • #11
                      Zitat von ehorn Beitrag anzeigen
                      das mit dem Header versteh ich nicht? Ich geb doch davor gar nix aus oder seh ichs nur nicht?
                      Alles was vor dem öffnenden PHP Tag steht wird an den Client geschickt "ausgegeben" Was denkst Du passiert sonst damit?

                      Zitat von ehorn Beitrag anzeigen
                      Deine Ausführung zur Codierung sind sehr interessant, könnte ich mittels iconv das Problem in den Griff bekommen?
                      Die möglichen Probleme hab ich doch bereits geschrieben. Must Du selbst wissen ob das für Dich akzeptabel ist. Ich würde einfach keine Dateien mit Umlauten erlauben wenn es denn so zwingend auch auf einem Windows Webserver laufen muss. Unter Unixoiden Betriebssystemen gibts halt diese Probleme nicht.

                      Zitat von ehorn Beitrag anzeigen
                      An welcher Stelle müsste das denn eingebaut werden?
                      Das willst Du nicht wirklich!

                      Gruß, Ulf
                      PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                      Kommentar


                      • #12
                        Zitat von mermshaus Beitrag anzeigen
                        Weil man es manchmal liest: Es hängt eigentlich nicht daran, dass PHP „kein Unicode kann“ (was auch gar nicht stimmt).
                        Wie kommst Du auf das schmale Brett? Bis heute unterstützt PHP Unicode nicht vollständig. Das hat nix damit zu tun das PHP mit utf-8 umgehen kann. Das ist schließlich auch nur eine Teilmenge von Unicode! Es geht darum das halt keine komplette Unicodeunterstützung besteht. Dann müste nicht mehr die Krücke zum Einsatz kommen die Dateinamen aus windows utf-16 nach was einfacheren zu konvertieren.

                        Zitat von mermshaus Beitrag anzeigen
                        Irgendwas passt wohl mit der Windows-Version einer Bibliothek nicht, die PHP nutzt, um mit dem Dateisystem zu „kommunizieren“. Aus irgendeinem Grund reicht die die Dateinamen nicht einfach byteweise durch oder so, sondern mappt irgendwas um.
                        Argh! Das ist dann der Grund warum es unter Windows keine Programme gibt die Unicode kennen? LOL

                        Unter Unixoiden ist es einfach nicht nötig bzgl. Dateisystem irgendwas aus utf-16 nach etwas abbilden zu wollen was mit der Informationsmenge nicht umgehen kann. Dateisystem ist halt utf-8 ucs o.ä. und nicht utf-16.

                        Wenn PHP Unicode vollständig unterstützen würde gibt es einfach das Problem nicht unter Windows.



                        Gruß, Ulf
                        PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                        Kommentar


                        • #13
                          Es geht darum das halt keine komplette Unicodeunterstützung besteht.
                          Für mich ist das Problem in diesem Thread primär eine Issue einer Komponente von PHP bei einem bestimmten Betriebs- und Dateisystem.[1]

                          This is a problem that affects all applications that use the standard C stdio library calls from the MS C runtime, including PHP, Java and others. (Some languages, like Python, have special support for Unicode filenames using Windows-specific APIs instead of the C stdlib; there is Request 45517 to get the same into PHP but don't hold your breath.)

                          On non-Windows platforms, Unicode tends to be supported by using byte strings with the UTF-8 encoding, and so all Unicode characters just work. Unfortunately Windows does not have this capability (code page 65001 is kind-of UTF-8, but badly broken).
                          - http://stackoverflow.com/a/11124256

                          Auch ganz interessant:

                          On OS/X all filenames are encoded as UTF-16. You don't have to know about this, because the API's PHP uses are UTF-8, and are transparently translated for you.
                          - http://evertpot.com/filesystem-encoding-and-php/


                          [1] Meine Aussage dazu war nicht auf dein Zitat vorher bezogen, falls das so wirkte. Ich kam darauf, weil ich beim Recherchieren für diesen Thread auf diese Überschrift („PHP really doesn’t do Unicode“) gestoßen bin. Es ist schon klar, wie das in dem Kontext gemeint ist (ist auch okay), aber in Anbetracht der Tatsache, dass im Grunde seit Jahren jeder etwas bessere PHP-Code durchgängig mit UTF-8 arbeitet…

                          Dass PHP nicht grundlegend um Unicode herum aufgebaut ist, ist aber natürlich auch nicht von der Hand zu weisen.

                          Kommentar

                          Lädt...
                          X