hawkmaster: Zeichensatzproblem

0 92

Zeichensatzproblem

hawkmaster
  • sonstiges
  1. 0
    Auge
    1. 0
      hawkmaster
      1. 0
        Auge
        1. 0
          hawkmaster
          1. 0
            Matthias Apsel
            1. 0
              hawkmaster
          2. 0
            Der Martin
            1. 0
              hawkmaster
              1. 0

                Bug?

                hawkmaster
                1. 0
                  Der Martin
                  1. 0
                    hawkmaster
                    1. 0
                      Der Martin
                      1. 0
                        hawkmaster
                        1. 0
                          Tom
                          1. 0
                            hawkmaster
                          2. 0
                            Der Martin
                            1. 0

                              Normalisierung,

                              hawkmaster
                          3. 0

                            Bug? Aber ein mächtiger! Oder wir sind beide bloed (ohne ö)

                            Tom
                            1. 0
                              Tom
                            2. 0

                              Das wird ja immer irrer!

                              Tom
                              1. 0
                                hawkmaster
                                1. 0
                                  Auge
                                  • meinung
                                  1. 0
                                    Tom
                                  2. 0
                                    hawkmaster
                                    1. 0
                                      Auge
                                2. 0
                                  Tom
                                  1. 0
                                    Der Martin
                                    1. 0

                                      Windows Zeichentabelle

                                      Tom
                                      1. 0
                                        Der Martin
                                        1. 0
                                          Tom
                                          1. 0
                                            Der Martin
                                            1. 0
                                              Tom
                                              1. 0
                                                Der Martin
                                              2. 0
                                                Tom
                                                1. 0
                                                  Der Martin
                                                  1. 0
                                                    Tom
                              2. 0
                                hawkmaster
                                1. 0
                                  Der Martin
                                  1. 0
                                    hawkmaster
                                    1. 0
                                      Tom
                                      1. 0
                                        hawkmaster
                                        1. 0
                                          hawkmaster
                                          1. 0
                                            Auge
                                            1. 0
                                              hawkmaster
                                              1. 0
                                                Auge
                                                1. 0
                                                  hawkmaster
                                                2. 0
                                                  Tom
                                                  1. 0

                                                    Filenames für Windows oder Linux(?) kastrieren!

                                                    Tom
                                                    • php
                                                    1. 0

                                                      HILFE! Filenames für Windows oder Linux(?) kastrieren!

                                                      Tom
                                                      1. 0
                                                        Felix Riesterer
                                                        1. 0

                                                          Klasse für utf-8 Umwandlungen und utf-8 Erkennung

                                                          Tom
                                                          1. 0

                                                            Archivierung von Threads

                                                            Matthias Apsel
                                                            • zu diesem forum
                                                        2. 0
                                                          hawkmaster
                                                          1. 2
                                                            Christian Kruse
                                                            1. 0
                                                              Tom
                                                            2. 0
                                                              hawkmaster
                                                              1. 0
                                                                Christian Kruse
                                                                1. 0

                                                                  Die Lösung

                                                                  hawkmaster
                                                                  1. 0

                                                                    Extension

                                                                    hawkmaster
                                                                    1. 0
                                                                      Tom
                                                                      1. 0
                                                                        Tom
                                                                        1. 0

                                                                          Bitte @ Gunnar: Abbildungstypen im Normalizer erläutern

                                                                          Tom
                                                                          • programmiertechnik
                                                                          1. 0
                                                                            Gunnar Bittersmann
                                                                            1. 0
                                                                              Tom
                                                                  2. 0
                                                                    Tom
                                                                  3. 0

                                                                    Die Lösung, noch nicht ganz!

                                                                    Tom
                                                        3. 0
                                                          Gunnar Bittersmann
                                                      2. 0
                                                        hotti
                                                  2. 0
                                                    hawkmaster
                                                    1. 0
                                                      Der Martin
                                                      1. 0

                                                        genaus so

                                                        hawkmaster
                                              2. 0
                                                Tom
                                                1. 0

                                                  versehentlich geschlossener Tab

                                                  Matthias Apsel
                                          2. 0
                                            Tom
                                          3. 3
                                            Christian Kruse
    2. 0
      hawkmaster
      1. 0
        Auge
        1. 0
          hawkmaster
  2. 0
    Matthias Apsel
    1. 0
      Matthias Apsel
      1. 0
        hawkmaster
    2. 0
      hawkmaster
  3. 0
    Gunnar Bittersmann
    1. 0
      Tom
      1. 0
        Gunnar Bittersmann
    2. 0
      hawkmaster
      1. 0
        Auge
      2. 0
        Christian Kruse
  4. 0
    Tom
    1. 0
      hawkmaster
  5. 0
    Jörg Reinholz

Hallo zusammen,

Ich habe ein seltsames Problem.
Bei einem Datei Upload mit einem PHP Formular kam eine Fehlermeldung bei einer bestimmten Datei.

Die Datei heisst
Sys_Eng_für_ProjVA_2014.pdf

Ich habe herausgefunden das es am ü liegt. Allerdings kann ich andere Dateien von mir selbst erstellt die viele Sonderzeichen haben wie ü ß ä ü ohne Probleme hochladen.

Noch kurioser ist folgendes:
Wenn ich die original Datei nehme, im Windows Explorer das ü lösche und durch ein neues ü ersetze, ist alles in Ordnung. Ich kann den Upload ohne Fehler machen.

Bei der Webandendung steht im Header:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Ich bin jetzt nicht so der Zeichensatzexperte. ISt denn ein ü auf einem Windows 7 Pc nicht immer gleich im Dateinamen?

Wenn ich nun mit F2 den Dateinamen im Explorer kopiere und in Notepad++ oder Textpad kopiere sieht das ü plötzlich so aus:
Eng_fu¨r_

Wenn ich jedoch wiederum im selben Notepad++ Fenster ein ü schreibe ist es ok.

Wie kann man herausfinden welche Kodierung das ü hat?

Also bei meinem Dateiupload mache ich das mit "utf8_decode"

$file_name = utf8_decode($_FILES['fileuploads']['name'][$i]);
Hier tritt der Fehler dann auf uns die Datei wird als
Eng_fu?r_Proj...   angezeigt.

Wenn ich das ganze ohne "utf8_decode" mache also;
$file_name = $_FILES['fileuploads']['name'][$i];

Dann bekomme ich keine Fehler. Allerdings sieht es dann in der Webanwendung etwas seltsam aus und man kann das ü nicht mehr lesen.

Jetzt bin ich etwas ratlos was zu tun ist?

vielen Dank und viele Grüße
hawk

  1. Hallo

    Die Datei heisst
    Sys_Eng_für_ProjVA_2014.pdf

    Pro JVA, so so. :-)

    Ich bin jetzt nicht so der Zeichensatzexperte. ISt denn ein ü auf einem Windows 7 Pc nicht immer gleich im Dateinamen?

    Wenn ich nun mit F2 den Dateinamen im Explorer kopiere und in Notepad++ oder Textpad kopiere sieht das ü plötzlich so aus:
    Eng_fu¨r_

    Hast du 'nen MAC? Das nebeneinander darstellen von Vokal und Ü-Strichchen kommt mir aus dieser Ecke irgendwie bekannt vor.

    Also bei meinem Dateiupload mache ich das mit "utf8_decode"

    Warum?

    Wenn ich das ganze ohne "utf8_decode" mache also;
    $file_name = $_FILES['fileuploads']['name'][$i];

    Dann bekomme ich keine Fehler. Allerdings sieht es dann in der Webanwendung etwas seltsam aus und man kann das ü nicht mehr lesen.

    Was wird denn stattdessen angezeigt? Dateinamen müssen im HTTP-Kontext bei Bedarf (z.B. wegen Umlauten) maskiert werden. In PHP erledigt das rawurlencode, speziell für den Querystring einer URL urlencode. Browser wandeln Eingaben in ihre Adresszeile auch automatisch um. Ansonsten würde es mich sehr wundern, wenn da ohne dein Zutun irgendwas verstümmelt wird.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
    Terry Pratchett, "Wachen! Wachen!"
    ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
    Veranstaltungsdatenbank Vdb 0.3
    1. Hallo Auge,

      vielen Dank für deine Hilfe, bin gerade total verwirrt...

      Hast du 'nen MAC? Das nebeneinander darstellen von Vokal und Ü-Strichchen kommt mir aus dieser Ecke irgendwie bekannt vor.

      nein, aber ich habe gerade gesehen das PDF Datei auf einem
      Mac OS X 10.8.5 mit Quartz PDF Context erstellt wurde.

      Vermutlich daher das Problem mit dem ü ?
      Die Frage ist, wie kann man erkennen woher solch eine Datei kommt und welche Kodierung die hat bzw. muss man dann solch eine MAC Datei besonders behandeln?

      Wenn ich das ganze ohne "utf8_decode" mache also;
      $file_name = $_FILES['fileuploads']['name'][$i];

      Dann bekomme ich keine Fehler. Allerdings sieht es dann in der Webanwendung etwas seltsam aus und man kann das ü nicht mehr lesen.

      Was wird denn stattdessen angezeigt?

      Also ohne dem utf8_decode sieht eine Testdatei "Das+ist~mit@sönderZüchenß&.ps" von einem Windows PC mit vielen Sonderzeichen so aus:

      ICH KANN DAS HIER NICHT eingeben da beim Absenden ein Fehler kommt
      Fehler

      Sie haben ein Zeichen eingegeben, dass vom W3C als „discouraged character“ gekennzeichnet ist

      Ich habe mal versucht vorher eine Prüfung auf utf8 wie folgt zu machen:

        
      $validUTF8 = mb_check_encoding($_FILES['fileuploads']['name'][$i], 'UTF-8');  
      echo "mb_check ist " . $validUTF8 ;  
      echo "<br>";  
      $validUTF8 =  mb_detect_encoding($_FILES['fileuploads']['name'][$i], 'UTF-8', true);  
      echo "mb_check ist " . $validUTF8 ;  
      
      

      Allerdings wird mir hier immer utf8 bzw. 1 angezeigt, egal welche Datei ich lade.

      vielen Dank und viele Grüße
      hawk

      1. Hallo

        Hast du 'nen MAC? Das nebeneinander darstellen von Vokal und Ü-Strichchen kommt mir aus dieser Ecke irgendwie bekannt vor.

        nein, aber ich habe gerade gesehen das PDF Datei auf einem
        Mac OS X 10.8.5 mit Quartz PDF Context erstellt wurde.

        Vermutlich daher das Problem mit dem ü ?

        Öhhm, das kann ich dir nicht mit Gewissheit sagen. Wie gesagt, mir schwant, Umlaute aus zwei Zeichen und Mac schon mal zusammen gesehen zu haben. Fazit: eventuell ja, eventuell nein (ich weiß, dass dir das nicht hilft).

        Die Frage ist, wie kann man erkennen woher solch eine Datei kommt und welche Kodierung die hat bzw. muss man dann solch eine MAC Datei besonders behandeln?

        Gunnars Link erklärt ja, was das ist und das sowohl „ü“ als auch „u¨“ erlaubt sind. Wie du der Normalisierung möglichst auch automatisiert und für alle Eventualitäten nachkommen kannst, weiß ich nicht genau. Aber …

        Wenn ich das ganze ohne "utf8_decode" mache also;
        $file_name = $_FILES['fileuploads']['name'][$i];

        Dann bekomme ich keine Fehler.

        … dieser Code macht erstmal, was er soll und geht auch richtig mit der Kodierung um.

        Allerdings sieht es dann in der Webanwendung etwas seltsam aus und man kann das ü nicht mehr lesen.

        Ich würde an deiner Stelle eher zusehen, wie ich mit diesem Punkt umgehen kann. Was da schiefläuft können wir ohne weiteren Code bzw. Beispiele nicht sehen.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        Veranstaltungsdatenbank Vdb 0.3
        1. Hallo zusammen,

          vielen Dank an Alle für die Hilfe.

          Ich würde an deiner Stelle eher zusehen, wie ich mit diesem Punkt umgehen kann. Was da schiefläuft können wir ohne weiteren Code bzw. Beispiele nicht sehen.

          Wie gesagt, man kann hier im Forum wohl keine solche Sonderzeichen darstellen? Ich habe es jetzt mal versucht, indem ich das als Bild gespeichert habe.

          Auf dem Windows Dateisystem befindet sich diese Dateien.
          Das+ist~mit@sönderZüchenß&.ps
          Eng_für_ProjVA_2014.pdf

          Nach dem Uplaod sieht es dann auf der Seite so aus:

          Nochmals um was es geht:
          Ein Anwender wählte eine Datei (PDF, TXT, Doc, PS ...) von seinem lokalen Windows System aus und lädt sie über eine Webseite hoch. Die Webseite ist mit utf-8 kodiert;

          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

          Der Dateiname (es geht nur um den Dateinamen) wird in einem <select> angezeigt.

          Ohne dem utf8_decode klappt zwar der Upload, aber die Dateinamen sehen bei Umlauten und Sonderzeichen wie oben aus.
          Der Anwender macht noch ein paar Zusatzangaben. Danach werden die Dateien auf dem Webserver in ein anderes Verzeichnis umkopiert.

          Bisher klappte alles gut soweit bis jetzt diese Datei von einem MAC kam. Wie gesagt: Wenn man bei dieser Datei mit dem Windows Explorer das original ü löscht und dann neu schreibt geht es auch wieder mit utf8_decode.

          vielen Dank und viele Grüße
          hawk

          1. Om nah hoo pez nyeetz, hawkmaster!

            Wie gesagt, man kann hier im Forum wohl keine solche Sonderzeichen darstellen? Ich habe es jetzt mal versucht, indem ich das als Bild gespeichert habe.

            Offensichtlich doch, denn ich habe gestern die Eingabe bei uniview getätigt, indem ich einfach deinen Text aus dem OP kopiert habe.

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Verl und Verlies.

            1. Hallo Matthias

              vielleicht reden wir aneinander vorbei.
              Wenn ich die Sonderzeichen sie wie ich sie vorhin in dem Bild gezeigt, als reinen Text hier versuche zu kopieren, dann kommt diese Fehlermeldung:

              Fehler

              Sie haben ein Zeichen eingegeben, dass vom W3C als „discouraged character“ gekennzeichnet ist. Leider können solche Zeichen nicht verarbeitet werden. Zu der Gruppe von Zeichen gehören z. B. alle Steuerzeichen ausser dem Zeilenumbruch, dem Zeilenvorschub und dem Tabulator-Zeichen.

              Wie gesagt
              Wenn ich diese Datei
              Das+ist~mit@sönderZüchenß&.ps

              ohne utf8_decode und mit
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              hochlade werden die Sonderzeichen wie in dem Bild dargestellt. Wenn ich nun im Browser auf Quelltext gehe, den Dateinamen dort kopiere und hier einfügen möchte, geht das nicht.

              vielen Dank und viele Grüße
              hawk

          2. Moin,

            Auf dem Windows Dateisystem befindet sich diese Dateien.
            Das+ist~mit@sönderZüchenß&.ps
            Eng_für_ProjVA_2014.pdf

            Nach dem Uplaod sieht es dann auf der Seite so aus:

            das erste Beispiel, in dem aus dem u anscheinened uÌ wird, kommt mir tatsächlich etwas eigenartig vor. Das zweite sieht aber nach einem korrekt in UTF-8 codierten Namen aus, der dann aber falsch als ISO-8859-x interpretiert wird. Du hast offensichtlich keine durchgängige Verarbeitung in UTF-8.

            Nochmals um was es geht:
            Ein Anwender wählte eine Datei (PDF, TXT, Doc, PS ...) von seinem lokalen Windows System aus und lädt sie über eine Webseite hoch.

            Ja, und auf die im Dateisystem verwendete Codierung hast du keinen Einfluss. Das ist leider eine Schwachstelle in der Kette. Allerdings ist das IMO nicht einmal das Problem. Das Grundproblem ist wohl eher, dass irgendein Glied in deiner Verarbeitungskette die Darstellung von Umlauten als Basiszeichen + Combining Diaresis, die in Unicode als Variante erlaubt ist, nicht beherrscht.

            Die Webseite ist mit utf-8 kodiert;

            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

            Ist sie das wirklich, oder steht das nur so drin?

            Der Dateiname (es geht nur um den Dateinamen) wird in einem <select> angezeigt.

            Ohne dem utf8_decode klappt zwar der Upload, aber die Dateinamen sehen bei Umlauten und Sonderzeichen wie oben aus.

            Das deutet darauf hin, dass deine Webseite in Wirklichkeit eben nicht UTF-8 benutzt!

            Bisher klappte alles gut soweit bis jetzt diese Datei von einem MAC kam. Wie gesagt: Wenn man bei dieser Datei mit dem Windows Explorer das original ü löscht und dann neu schreibt ...

            ... dann wird u + Combining Diaresis (\U+0075, \U+0308) in die "homogene" Darstellung (U+00FC) umgewandelt. Beides sind gültige Unicode-Darstellungen des Zeichens ü.

            ... geht es auch wieder mit utf8_decode.

            Und das solltest du ausbessern: Wenn durchgängig überall dieselbe Codierung verwendet wird (z.B. UTF-8), ist ein solches Hin- und Herwandeln, bei dem ja auch Information verlorengehen kann, nicht nötig. Wahrscheinlich ist das auch die Ursache für das uÌ aus dem oben gezeigten Beispiel.

            So long,
             Martin

            --
            Kriege kennen keinen Gewinner. Es gibt nur Verlierer und das sind wir.
              (Hotti)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo Martin,

              recht herzlichen Dank für deine Hilfe und Geduld.

              Das deutet darauf hin, dass deine Webseite in Wirklichkeit eben nicht UTF-8 benutzt!

              Doch hatte sie, ABER ich zeige die Dateien die hochgeladen werden in einem <select> an und hier hatte ich nochmals utf8_encode gemacht.
              Wenn ich nun diese utf8_decode und utf8_encode rausnehme ist die Anzeige in Ordnung.
              ABER; die Dateien mit Umlaute werden ja beim Upload Vorgang kopiert.

              if(copy($file, "$userupload/$newcomplete")){

              Jetzt landen diese aber im Windows Dateisystem wiederum "verkrüppelt" also so wie in dem Bild. Und eine weitere Verarbeitung bzw. kopieren scheitert dann.

              vielen Dank und viele Grüße
              hawk

              1. Hmmm,
                ich bin gerade auf diesen eigentlich alten Bug gestossen.

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

                Kann das auch in meinem Fall zutreffen weil ich ja hier auch UTF8 Zeichensätze habe und mit der Copy Funktion auf Windows Ebene zugreifen möchte?

                vielen Dank und viele Grüße
                hawk

                1. Hallo,

                  ich bin gerade auf diesen eigentlich alten Bug gestossen.
                  https://bugs.php.net/bug.php?id=46990

                  ich kann das anhand der Beschreibung zumindest in der Theorie nicht nachvollziehen. Es gibt in PHP keinen Mechanismus, der NCRs auf die entsprechenden Unicode-Zeichen abbildet - das macht höchstens ein Browser, der diese im HTML-Code bekommt. Also ist auch nicht logisch, dass im Zusammenspiel von PHP und dem lokalen Filesystem '&#26085;&#26412;&#35486;' zu '日本語' mutieren sollte - die Implementierung gibt das eigentlich nicht her. Diese Umsetzung muss daher schon auf der Clientseite stattgefunden haben.

                  Vielleicht meint er abr auch genau das ("ich habe mich geirrt, da ist kein Bug") mit seinem Follow-Up, ich verstehe es nicht wirklich.

                  Kann das auch in meinem Fall zutreffen weil ich ja hier auch UTF8 Zeichensätze habe und mit der Copy Funktion auf Windows Ebene zugreifen möchte?

                  Ähm ... redest du von einem Webserver samt PHP, der auf deiner Windows-Büchse läuft? Ich hatte deine bisherigen Beschreibungen so verstanden, dass du von einem Webserver beim Hoster redest, und dann hätte PHP nichts mit deinem lokalen Windows zu schaffen. Wie denn nun?

                  So long,
                   Martin

                  --
                  Solange der Nagellack nicht trocken ist,
                  ist eine Frau praktisch wehrlos.
                    (Burt Reynolds, US-Schauspieler)
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Hallo Martin,

                    danke nochmals,

                    Ähm ... redest du von einem Webserver samt PHP, der auf deiner Windows-Büchse läuft? Ich hatte deine bisherigen Beschreibungen so verstanden, dass du von einem Webserver beim Hoster redest, und dann hätte PHP nichts mit deinem lokalen Windows zu schaffen. Wie denn nun?

                    Ja genau, ich rede von einem lokalen XAMPP der auf Windows läuft samt PHP und DB

                    Ich google schon eine Weile und immer wieder stosse ich in Zusammenhang mit PHP und Windows bzw. UTF8 und Dateien mit Umlauten oder Sonderzeichen auf dieselbe Probleme. Die meisten Empfehlungen gehen dahin, keine Sonderzeichen zu verwenden. (was natürlich auch nicht einfach ist)

                    z.b. http://evertpot.com/filesystem-encoding-and-php/

                    Ich glaube fast ich muss bei meiner alten Lösung bleiben und ein utf8_decode machen damit die Dateien auch auf dem Windows Filesystem richtig gespeichert werden und kopiert werden können.

                    Oder hast du noch eine bessere Idee?

                    vielen Dank und viele Grüße
                    hawk

                    1. Hi,

                      Ja genau, ich rede von einem lokalen XAMPP der auf Windows läuft samt PHP und DB

                      ah, gut. Das ist mir aus der bisherigen Schilderung nicht ganz klar geworden. Spielt aber auch nur am Rand eine Rolle.

                      Ich glaube fast ich muss bei meiner alten Lösung bleiben und ein utf8_decode machen damit die Dateien auch auf dem Windows Filesystem richtig gespeichert werden und kopiert werden können.

                      Das sehe ich nicht so.

                      Oder hast du noch eine bessere Idee?

                      Möglicherweise ja. Ich würde an den Dateinamen gar nichts umcodieren - bis auf die Zeichen, die im Windows-Dateisystem nicht erlaubt sind. Das sind AFAIK nur ["*/:<>?|] und das NUL-Zeichen. Aber alle Unicode-Zeichen ab U+00A0 sollten problemlos verwendbar sein.
                      Das kann zwar zur Folge haben, dass der Dateiname intern nicht korrekt angezeigt wird. Aber beim Weg zurück aus dem Dateisystem über PHP sollte es wieder stimmen; ignoriere also einfach die nicht korrekte interne Anzeige im Explorer. Die ist nebensächlich. Stelle nur sicher, dass nach einem kompletten Roundtrip wieder das ankommt, was ursprünglich reingeht. Und das ist am einfachsten, wenn man auf jede Umcodierung verzichtet.

                      Ciao,
                       Martin

                      --
                      Alleine sind wir stark ...
                      gemeinsam sind wir unausstehlich!
                      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                      1. Hallo

                        ich brauche doch nochmals bitte eure Hilfe.

                        Ich würde an den Dateinamen gar nichts umcodieren
                        ... ignoriere also einfach die nicht korrekte interne Anzeige im Explorer. Die ist nebensächlich.

                        Hmm, ok also wenn ich das utf8_decode und utf8encode rausnehme klappt das schon auch. Zumindest mit der Anzeige im Webbrowser. Aber im Windows Dateisystem steht dann einfach für die Tesatdatei
                        Das+ist~mit@sönderZüchenß&.ps folgende Zeichen. (den Zeitstempel bis zum @ bitte ignorieren)

                        Wie gesagt, für meine Webanwendung im Browser und interner Speicherung in einer MySQL Db würde das gehen, aber mit den Dateien soll ja später weiter gearbeitet werden. z.b. angezeigt oder gedruckt.

                        Wie bekommt man die Dateien dann zum Schluss wieder ins leserliche Format?

                        vielen Dank und viele Grüße
                        hawk

                        1. Hello,

                          Hmm, ok also wenn ich das utf8_decode und utf8encode rausnehme klappt das schon auch. Zumindest mit der Anzeige im Webbrowser. Aber im Windows Dateisystem steht dann einfach für die Tesatdatei
                          Das+ist~mit@sönderZüchenß&.ps folgende Zeichen. (den Zeitstempel bis zum @ bitte ignorieren)

                          Wie gesagt, für meine Webanwendung im Browser und interner Speicherung in einer MySQL Db würde das gehen, aber mit den Dateien soll ja später weiter gearbeitet werden. z.b. angezeigt oder gedruckt.

                          Wie bekommt man die Dateien dann zum Schluss wieder ins leserliche Format?

                          Für Windows (NTFS) musst Du UTF-16 benutzen. Dann sollte es Funktionieren.

                          In der Konstanten PHP_OS sollte das Betriebssystem drinstehen, auf dem der Apache und PHP laufen. Daraus kannst Du dann zumindest ansatzweise raten, dass bei WIN(NT)wohl NTFS im Einsatz sein wird.

                          Den in utf-8 übertragenen Dateinamen musst Du dann vor dem Speichern unter NTFS nach utf-16 übersetzen. Dann sollte es klappen. Ich bitte um Rückmeldung.

                            
                          Ich weise aber nochmals darauf hin, dass vom Client gesendete Dateinamen nicht bedenkenlos ins Filesystem des Servers übertragen werden dürfen!  
                          
                          

                          Liebe Grüße aus dem schönen Oberharz

                          Tom vom Berg

                          --
                           ☻_
                          /▌
                          / \ Nur selber lernen macht schlau
                          http://bikers-lodge.com
                          1. Hallo Tom,

                            herzlichen Dank das du nochmals in diesen Thread schaust. Ich drehe mich nämlich im Kreise und google und komme dennoch nicht weiter :-)

                            Den in utf-8 übertragenen Dateinamen musst Du dann vor dem Speichern unter NTFS nach utf-16 übersetzen. Dann sollte es klappen. Ich bitte um Rückmeldung.

                            Was ich jetzt bisher versucht habe:

                            Ich habe mal zum testen mein ganzes utf8_decode und utf8_encode rausgenommen.
                            In der Webseite steht jetzt also nur noch:
                            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

                            1. Ich wähle die Datei "Das+ist~mit@sönderZüchenß&.ps" vom Windows Dateisystem und lade sie in der Webanwendung hoch. Anzeige im Browser = sauber und leserlich als genauso wie im Dateisystem. Aber im Filesystem ist sie jetzt wie im Beispielbild oben. OK, erst mal ignorieren.

                            2. Es werden noch ein paar Angaben im Webformular gemacht, dann Submit. Dateiinfos werden in einer DB gespeichert und die Datei wird umkopiert für weitere Verwendung.

                            copy("$userupload/$new_name", "$ziel_dir/$new_name")
                            Jetzt mache ich zum Schluss ein Rename:
                            $new_name_decode = utf8_decode($new_name);
                            rename("$ziel_dir/$new_name" ,  "$ziel_dir/$new_name_decode");

                            So wäre der gesamte Workflow ok. Also Anzeige im Browser ok. Speicherung in der DB ok und Anzeige im Windows Dateisystem auch wieder ok und leserlich mit Umlauten und Sonderzeichen.
                            Das funktioniert nun so für alle "normalen" Dateien die auf dem Windows System erstellt wurden.
                            ABER, jetzt kommt wieder das Problem mit dieser MAC Datei und dem ü als
                            0075  LATIN SMALL LETTER U
                            0308  COMBINING DIAERESIS

                            Bei dieser Datei sieht das auf dem Dateisystem dann so aus:

                            Hier greift dann das rename mit vorherigem utf8_decode nicht. Es kommt zu "No such file or directory .. Eng_fu?r_ProjVA_2014.pdf".

                            Und jetzt bin ich an dem Punkt wo ich nicht weiterkomme.

                            Was meintest du mit UTF16 umwandeln. So etwas in der Art?
                            $file_name = mb_convert_encoding($_FILES['fileuploads']['name'][$i],'utf-16');

                            vielen Dank und viele Grüße
                            hawk

                          2. Hi,

                            Wie gesagt, für meine Webanwendung im Browser und interner Speicherung in einer MySQL Db würde das gehen, aber mit den Dateien soll ja später weiter gearbeitet werden. z.b. angezeigt oder gedruckt.

                            das hatte ich nicht berücksichtigt - ich bin davon ausgegangen, dass die Dateien nur per PHP angelegt und auch wieder gelesen werden. Wenn sie noch durch eine andere lokale Anwendung verarbeitet werden, die dann auch wieder anständige Dateinamen sehen soll, wird's echt <quote origin="kaiderkobold">kompliziert und knifflig</quote>.

                            Für Windows (NTFS) musst Du UTF-16 benutzen. Dann sollte es Funktionieren.

                            Ich bin nicht überzeugt, dass das hilft. Es stimmt zwar, dass Windows intern UCS-2 verwendet (eine Abart von UTF-16), aber um das ausnutzen zu können, muss man bei allen API-Funktionen, die mit Dateinamen hantieren, die W-Varianten (Wide) verwenden. Das tut PHP bestimmt nicht. Die Standardfunktionen gehen aber stur von Windows-1252 aus (womit viele Zeichen wieder nicht dargestellt werdne können).

                            Allgemein ist das Dateisystem des Hosts *immer* eine Ungewissheit. Man weiß nicht, welche Codierung das OS bei seinen API-Funktionen erwartet, und es gibt auch keine Standards. Es könnte UTF-8 sein, oder UTF-16, oder manchmal auch einfach nur ASCII.

                            Ich weise aber nochmals darauf hin, dass vom Client gesendete Dateinamen nicht bedenkenlos ins Filesystem des Servers übertragen werden dürfen!

                            *sign*

                            So long,
                             Martin

                            --
                            Soziologen sind nützlich, aber keiner will sie haben.
                            Bei Informatikern ist es gerade umgekehrt.
                            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                            1. Hallo Martin,

                              auch dir nochmals herzlichen Dank für die weitere Hilfe.

                              ... Wenn sie noch durch eine andere lokale Anwendung verarbeitet werden, die dann auch wieder anständige Dateinamen sehen soll, wird's echt <quote origin="kaiderkobold">kompliziert und knifflig</quote>.

                              Ja das merke ich :-)
                              und wenn dann noch Dateien vom MAC kommen die "normalisiert" sind bzw. eigentlich auch zwei Zeichen bestehen, wird ganz doof...

                              Ich hatte ja Tom vorhin geantwortet. Also für den "normalen" Workflow mit Windows Dateinamen (dort erstellt) klappt das alles jetzt, wenn ich ganz am Ende ein "rename() mit utf8_decode mache.

                              Nur halt für diese MAC Datei nicht.
                              Ich fand noch diesen alten Beitrag vom Jahr 2010. Hier hatte jemand ein ähnliches Problem. Dedlfix hatte ein paar Ratschläge gegeben aber ich glaube eine endgültige Lösung wurde auch nicht gefunden.

                              http://forum.de.selfhtml.org/archiv/2010/1/t194677/

                              Die Frage stellt sich mir. Wie könnte man mit PHP solch eine Datei "..Eng_fu¨r_" erkennen und behandeln?

                              vielen Dank und viele Grüße
                              hawk

                          3. Hello,

                            da hast Du mir ja jetzt schön 'was eingebrockt :-)

                            Ich habe selber mal angefangen zu testen und bin sofort auf zwei Hämmer (mit 'ä') gelaufen:

                            Rahmenbedingungen:

                            XAMPP Version: 1.8.2
                            Windows XP SP3 32-bit
                            (Windows NT PC48 5.1 build 2600 (Windows XP Professional Service Pack 3) i586)
                            Dateisystem NTFS
                            PHP-Version 5.4.22

                            Apache ist eingestellt auf ISO-8859-1

                            Wenn ich mit einem Upload-Formular einen Dateinamen im <input type="text"> zum Server sende und dann mit diesem Namen mittels touch() eine Datei erzeuge, wird die Im Datei-Explorer auch angezeigt, egal, ob sie Umlaute und Sonderzeichen enthält, oder nicht.

                            Fall 1: Ich habe keine Dateien mit Sonderzeichen erzeugen lassen:
                            Mittels glob() kann ich mir die Dateinamen im Verzeichnis auslesen lassen

                            Fall 2: Ich habe _eine_ Datei mit Sonderzeichen erzeugen lassen:
                            Glob() schien dann vollkommen zu streiken.

                            Näher nachgeforscht, steckt der Fehler noch ganz woanders:

                              
                              
                            $_filelist = glob("*.txt");  
                            $filenames_html = htmlspecialchars(print_r($_filelist, 1));  
                              
                            
                            

                            spätere Ausgabe in

                              
                              
                            <div><pre><?php echo $filenames_html; ?></pre></div>  
                            
                            

                            liefert nix mehr.

                              
                              
                            $_filelist = glob("*.txt");  
                              
                            $filenames_html = '';  
                            foreach ($_filelist as $key => $value)  
                            {  
                            	$filenames_html .= htmlspecialchars("[$key] => $value\r\n");  
                            }  
                            
                            

                            in der zweiten Variante werden zumindest noch

                              
                              
                            [2] => Gute_Datei.txt  
                            [3] => Hallo.txt  
                              
                            
                            

                            angezeigt.

                            Wenn ich stattdessen

                              
                              
                            <div> <pre><?php var_dump(glob('*.txt')); ?></pre></div>  
                            
                            

                            benutze, kommt als Ergebnis im _selben_Durchlauf_

                              
                              
                            array(4) {  
                              [0]=>  
                              string(14) "Böse_Datei.txt"  
                              [1]=>  
                              string(20) "Böse_Datei_mit_ß.txt"  
                              [2]=>  
                              string(14) "Gute_Datei.txt"  
                              [3]=>  
                              string(9) "Hallo.txt"  
                            }  
                              
                            
                            

                            wenn ich die "bösen Dateien" wieder aus dem Verzeichnis lösche, funktionieren alle drei Varianten mit gleichem Ergebnis!

                            Da ist also augenscheinlich ganz mächtig 'was kaputt in PHP. Das zu ergründen, übersteigt aber meine Fähigkeiten und meine Lust dazu.

                            Ich wäre nur daran interessiert, dass jemand Berufenes das nochmal nachvollzieht und dann einen Bugreport daraus erstellt.

                            Liebe Grüße aus dem schönen Oberharz

                            Tom vom Berg

                            --
                             ☻_
                            /▌
                            / \ Nur selber lernen macht schlau
                            http://bikers-lodge.com
                            1. Hello,

                              hier noch schnell etwas Medizin, mit der ich mir in einem kleinen Galerie-Script beholfen habe:

                                
                                
                                 $_galleries = glob('../galleries/gal_*');  
                                 $error = '';  
                                
                                
                                 if (isset($_POST['data']['newname']) and strlen($_POST['data']['newname']) > 5)  
                                 {  
                                
                                    $_search  = array(' ', 'ä', 'ö', 'ü', 'ß', 'Ä', 'Ö', 'Ü');  
                                    $_replace = array('_', 'ae', 'oe', 'ue', 'ss', 'Ae', 'Oe', 'Ue');  
                                
                                    $_POST['data']['newname'] = str_replace($_search, $_replace, $_POST['data']['newname']);  
                                
                                    $_POST['data']['newname'] = urlencode($_POST['data']['newname']);  
                                
                                    $_lastgal = $_galleries[count($_galleries)-1];  
                                    $_lastgal_parts = explode('_', $_lastgal);  
                                    $lastgal_no = intval($_lastgal_parts[1]);  
                                
                                    $newname = 'gal_' . substr('000'.($lastgal_no +1),-3) . '_' . $_POST['data']['newname'];  
                                
                                    mkdir("../galleries/$newname",0774);  
                                    mkdir("../galleries/$newname/bilder",0774);  
                                    copy ("$_lastgal/index.php","../galleries/$newname/index.php");  
                                
                                 }  
                                
                              
                              

                              Ich lasse das hier mal so unkommentiert stehen im Kontext.

                              Es geht dabei eigentlich nur um die Teile, in denen ich die gewünschten neuen Verzeichnisnamen "kastriert" habe. So habe ich bisher keinen Ärger mehr gehabt.

                              Das ist sicherlich nur ein Denkansatz und bestimmt noch nicht schön oder fertig.

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bikers-lodge.com
                            2. Hello,

                              das wird ja immer irrer!

                                
                                
                              <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post" enctype="multipart/form-data">  
                                
                                  <input id="text" name="text" size="60" value="<?php echo htmlspecialchars($_POST['text']); ?>">  
                                  <input type="submit" name="btn[send]" value="senden">  
                                
                              </form>  
                                
                              
                              

                              Mit diesem Formular schicke ich den Namen zum Server.
                              Wenn ein "böse Dateiname" drinsteht, ist htmlspecialchars($_POST['text']) anschließend auch leer.

                              Aber die eigene Funktion

                                
                                
                              function tohex($str)  
                              {  
                                  $len = strlen($str);  
                              	  
                                  $msg = '';  
                                  for($i = 0; $i < $len; $i++)  
                                  {  
                                      $msg .= substr('00' . dechex(ord($str[$i])), -2) . ' ';  
                                  }  
                              	  
                                  return $msg;  
                              }  
                                
                              
                              

                              liefert _nach_ der Anwendung der Dateifunktionen (ich habe inzwischenauch fopen(...,'wb+') ausprobiert) noch ein Ergebnis:

                                
                                
                              <p><?php echo tohex($_POST['text']); ?></p>  
                              
                              

                              liefert:  53 63 68 65 69 df 65 2e 74 78 74

                              WAS ist da kaputt?

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bikers-lodge.com
                              1. Hallo Tom,

                                ja schon sehr kurios das Ganze. Und sorry das ich dich da in was reingewickelt habe :-))

                                Und jetzt lege mal eine Testdatei an die solch ein ü drin hat

                                Sys_Eng_für_ProjVA_2014.pdf

                                Dann wirds vielleicht noch bunter...

                                also,
                                0075  LATIN SMALL LETTER U
                                0308  COMBINING DIAERESIS

                                vielen Dank und viele Grüße
                                hawk

                                1. Hallo

                                  Und jetzt lege mal eine Testdatei an die solch ein ü drin hat

                                  Sys_Eng_für_ProjVA_2014.pdf

                                  Dann wirds vielleicht noch bunter...

                                  also,
                                  0075  LATIN SMALL LETTER U
                                  0308  COMBINING DIAERESIS

                                  Herrje, wir haben den Dateinamen jetzt schon -zig mal gesehen und dir mitgeteilt, dass dieser Aufbau des Umlauts ungewöhnlich sein mag, aber korrekt ist. Meinst du, vom ständigen wiederholen ändert sich etwas?

                                  Tschö, Auge

                                  --
                                  Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                                  Terry Pratchett, "Wachen! Wachen!"
                                  ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                                  Veranstaltungsdatenbank Vdb 0.3
                                  1. Hello Auge,

                                    Herrje, wir haben den Dateinamen jetzt schon -zig mal gesehen und dir mitgeteilt, dass dieser Aufbau des Umlauts ungewöhnlich sein mag, aber korrekt ist. Meinst du, vom ständigen wiederholen ändert sich etwas?

                                    Meintest Du mich?

                                    Vermutlich ja nicht.

                                    Jedenfalls sind wir hier durch Hawks Problem vermutlich auf einen mächtigen Bug in PHP gestoßen.
                                    Wäre schon gut, wenn das anhand meiner Beschreibungen mal jemand nachvollziehen könnte, oder aber den Denkfehler darin findet.

                                    Mir ist jedenfalls schleierhaft, was das Dateisystem mit den Globalen Variablen oder mit print_r(), htmlspecialchars() o.ä. zu tun hat.

                                    Liebe Grüße aus dem schönen Oberharz

                                    Tom vom Berg

                                    --
                                     ☻_
                                    /▌
                                    / \ Nur selber lernen macht schlau
                                    http://bikers-lodge.com
                                  2. Hallo Auge,

                                    Herrje, wir haben den Dateinamen jetzt schon -zig mal gesehen und dir mitgeteilt, dass dieser Aufbau des Umlauts ungewöhnlich sein mag, aber korrekt ist. Meinst du, vom ständigen wiederholen ändert sich etwas?

                                    Warum gleich so aufbrausend? Ich wollte doch Tom nur nochmals den Dateinamen hier posten damit er vielleicht auch mal mit diesem Namen testen kann.
                                    Und ja ich weiss nun das dies eine andere erlaubte Schreibweise ist und "normal" ist.
                                    In dem Link vom Archiv 2010 hatte ja jemand auch ein ähnliches Problem.

                                    Auch habe ich dafür noch keine Lösung gefunden, wie man den Dateinamen (nein ich wiederhole ihn jetzt nicht) der so aufgebaut mit PHP erkennen kann oder ihn wieder im Windows Dateisystem abspeichern kann.

                                    vielen Dank und viele Grüße
                                    hawk

                                    1. Hallo

                                      Herrje, wir haben den Dateinamen jetzt schon -zig mal gesehen und dir mitgeteilt, dass dieser Aufbau des Umlauts ungewöhnlich sein mag, aber korrekt ist. Meinst du, vom ständigen wiederholen ändert sich etwas?

                                      Warum gleich so aufbrausend?

                                      Ich empfand mich nicht als aufbrausend. Nur etwas genervt bin ich, weil ich den Datennamen und die Bestandteile, aus denen sein ü besteht, eben zum -zigsten Male gelesen habe.

                                      Ich wollte doch Tom nur nochmals den Dateinamen hier posten damit er vielleicht auch mal mit diesem Namen testen kann.

                                      Wenn er den Thread über diesen konkreten Strang hinaus gelesen hat, wovon ich ausgehe, ist der ihm nicht entgangen.

                                      Auch habe ich dafür noch keine Lösung gefunden, wie man den Dateinamen (nein ich wiederhole ihn jetzt nicht) …

                                      danke, puhh :-)

                                      Tschö, Auge

                                      --
                                      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                                      Terry Pratchett, "Wachen! Wachen!"
                                      ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                                      Veranstaltungsdatenbank Vdb 0.3
                                2. Hello Hawk,

                                  Und jetzt lege mal eine Testdatei an die solch ein ü drin hat

                                  Ich weiß nicht, wie ich das ins meine Win-Tastatur reinbekommen soll.
                                  Muss ich wahrscheinlich per Hex zusammenbasteln.

                                  0075  LATIN SMALL LETTER U
                                  0308  COMBINING DIAERESIS

                                  Liebe Grüße aus dem schönen Oberharz

                                  Tom vom Berg

                                  --
                                   ☻_
                                  /▌
                                  / \ Nur selber lernen macht schlau
                                  http://bikers-lodge.com
                                  1. Hi,

                                    Und jetzt lege mal eine Testdatei an die solch ein ü drin hat
                                    Ich weiß nicht, wie ich das ins meine Win-Tastatur reinbekommen soll.

                                    mit der Windows-Zeichentabelle (charmap.exe).

                                    Muss ich wahrscheinlich per Hex zusammenbasteln.

                                    Nö. Einfach nur rumklicken, dann copy&paste.

                                    Ciao,
                                     Martin

                                    --
                                    Irgendwann in grauer Vorzeit benutzte einer unserer prähistorischen Vorfahren ein Schimpfwort anstelle der Keule.
                                    Die Zivilisation hatte begonnen.
                                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                    1. Hello,

                                      Und jetzt lege mal eine Testdatei an die solch ein ü drin hat
                                      Ich weiß nicht, wie ich das ins meine Win-Tastatur reinbekommen soll.

                                      mit der Windows-Zeichentabelle (charmap.exe).

                                      Muss ich wahrscheinlich per Hex zusammenbasteln.

                                      Nö. Einfach nur rumklicken, dann copy&paste.

                                      0075 bekomme ich, aber
                                      0308 habe ich nirgends gefunden.

                                      Das kann ich zwar unter "Unicode" eingeben, lande dann aber immer auf dem nächstliegenden Codepoint. In welchem Font ist das denn drin?

                                      Liebe Grüße aus dem schönen Oberharz

                                      Tom vom Berg

                                      --
                                       ☻_
                                      /▌
                                      / \ Nur selber lernen macht schlau
                                      http://bikers-lodge.com
                                      1. Hi,

                                        mit der Windows-Zeichentabelle (charmap.exe).
                                        Einfach nur rumklicken, dann copy&paste.
                                        0075 bekomme ich

                                        klar, dazu brauchst du ja auch nur die 'u'-Taste zu drücken. ;-)

                                        0308 habe ich nirgends gefunden.
                                        Das kann ich zwar unter "Unicode" eingeben, lande dann aber immer auf dem nächstliegenden Codepoint. In welchem Font ist das denn drin?

                                        Wew, da hab ich gar nicht drüber nachgedacht - ich hatte den Tag über das Vergnügen, mich mit Windows 7 rumzuärgern, da war das auch im hundsgemeinen Arial-Font schon drin. Aber stimmt, die Fonts, die XP von Haus aus mitbringt, sind ja nur sehr eingeschränkt Unicode-bestückt.
                                        Mal eben XP/SP2 in einer VM angeworfen ... da finde ich das gesuchte Zeichen zum Beispiel in Lucida Sans Unicode, aber sonst sieht's schlecht aus ... :-(

                                        Ciao,
                                         Martin

                                        --
                                        Er:  Mit wem warst du gestern abend aus?
                                        Sie: Du bist mal wieder eifersüchtig wie immer!
                                        Er:  Wer ist Immer?
                                        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                        1. Hello,

                                          da finde ich das gesuchte Zeichen zum Beispiel in Lucida Sans Unicode, aber sonst sieht's schlecht aus ... :-(

                                          So, nun habe ich es auch gefunden und ausprobiert:

                                          Die Zeichenkombination würde übernommen und hat _nicht_ PHP zum Stillstand gebracht.

                                          Im Datei-Explorer steht es aber jetzt auch in der HTML-Entity-Form

                                            
                                            
                                          Bu&#776;rodatei.txt  
                                            
                                          
                                          

                                          Das Problem mit den Unicode-Zeichen, die man ja auch ganz normal im Browser eingeben kann, muss aber geklärt werden. Wer unterstützt mich da mal bei einem Bugreport?

                                          Liebe Grüße aus dem schönen Oberharz

                                          Tom vom Berg

                                          --
                                           ☻_
                                          /▌
                                          / \ Nur selber lernen macht schlau
                                          http://bikers-lodge.com
                                          1. n'Abend ...

                                            da finde ich das gesuchte Zeichen zum Beispiel in Lucida Sans Unicode, aber sonst sieht's schlecht aus ... :-(
                                            So, nun habe ich es auch gefunden und ausprobiert:

                                            und den Kontext überhaupt nicht bedacht, mein Freund!
                                            Der vom Nutzer in einem Textfeld eingegebene Text ist wirklich nur Text - da werden keine Zeichenreferenzen aufgelöst. Du hast also nicht das Zeichen U+0308 eingegeben und übermittelt, sondern die Zeichen '&', '#', '7', '7', '6' und ';'. Und als genau diese Sequenz werden sie auch zum Server übermittelt.

                                            Die Zeichenkombination würde übernommen und hat _nicht_ PHP zum Stillstand gebracht.

                                            Warum auch?

                                            Im Datei-Explorer steht es aber jetzt auch in der HTML-Entity-Form
                                            Bu&#776;rodatei.txt

                                            Logisch, genau so hast du es bestellt. Works as designed.

                                            Das Problem mit den Unicode-Zeichen, die man ja auch ganz normal im Browser eingeben kann, ...

                                            Nicht _kann_, sondern in diesem Fall _muss_. Numerische Zeichenreferenzen kannst du höchstens im HTML-Code (als value-Attribut) angeben.

                                            Wer unterstützt mich da mal bei einem Bugreport?

                                            Im Prinzip gern - ich müsste mir aber erst mal wieder eine geeignete Testumgebung züchten. Ich habe zwar noch einen echten Windows-PC für "schwierige Fälle", und jederzeit einen als VM. Aber Apache und PHP müsste ich erst wieder installieren, weil meine Windows-PCs nur noch minimalistisch ausgestattet sind.

                                            So long,
                                             Martin

                                            --
                                            Bis du einen Prinzen findest, musst du viele Frösche küssen.
                                            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                            1. Hello,

                                              da finde ich das gesuchte Zeichen zum Beispiel in Lucida Sans Unicode, aber sonst sieht's schlecht aus ... :-(
                                              So, nun habe ich es auch gefunden und ausprobiert:

                                              und den Kontext überhaupt nicht bedacht, mein Freund!
                                              Der vom Nutzer in einem Textfeld eingegebene Text ist wirklich nur Text - da werden keine Zeichenreferenzen aufgelöst. Du hast also nicht das Zeichen U+0308 eingegeben und übermittelt, sondern die Zeichen '&', '#', '7', '7', '6' und ';'. Und als genau diese Sequenz werden sie auch zum Server übermittelt.

                                              Nein. Habe ich nicht. Ich habe in dem Textfeld das vorher in der Zeichensatztabelle kombinierte Zeichen aus dem 0075 und dem 0308 mittels Copy&Paste ins Input-Feld eingefügt.

                                              Dann habe ich den Request ausgelöst.
                                              Was Du nun auf dem Bildschirm siehst, ist die Antwort. Es ist ja ein Affenformular. Wo und von wem das Zeichen umgewandelt wurde, weiß ich nicht. Ich habe dann lediglich die HTML-Entity für die Ausgabe gebildet.

                                              Bei der Ausgabe von var_dump() siehst Du ja auch noch die zwei überlagerten Zeichen, denn die ist ohne htmlspecialchars() erfolgt.

                                              Im Datei-Explorer steht es aber jetzt auch in der HTML-Entity-Form
                                              Bu&#776;rodatei.txt

                                              und die habe ich _nicht_ so im Request gehabt.
                                              Schau Dir doch mal an, was direkt am Scriptanfang nach dem Post angekommen ist am Server. Dazu ist die Zeile mit der Hexadezimaldarstellung da.

                                              Ich schiebe nochmal den Quelltext vom ganzen Script auf den öffentlichen Server.

                                              http://selfhtml.bitworks.de/bilder/filenames.php.txt

                                              Da kannst Du gucken, dass ich nicht gemogelt habe :-)

                                              Liebe Grüße aus dem schönen Oberharz

                                              Tom vom Berg

                                              --
                                               ☻_
                                              /▌
                                              / \ Nur selber lernen macht schlau
                                              http://bikers-lodge.com
                                              1. Hallo,

                                                Schau Dir doch mal an, was direkt am Scriptanfang nach dem Post angekommen ist am Server. Dazu ist die Zeile mit der Hexadezimaldarstellung da.

                                                42 75 26 23 37 37 36 3B 72 6F 64 61 74 65 69 2E 74 78 74
                                                Bu&#776;rodaten.txt
                                                Btw: Hex-Zahlen mit Kleinbuchstaben sind *sehr* gewöhnungsbedürftig.

                                                Da ist also das Kind schon in den Brunnen gefallen; es ist schon die verstümmelte NCR-Darstellung. Also hat der Client (Browser) schon NCRs gesendet. Was soll also PHP da tun, wenn es schon Garbage bekommt?

                                                http://selfhtml.bitworks.de/bilder/filenames.php.txt
                                                Da kannst Du gucken, dass ich nicht gemogelt habe :-)

                                                Ja, sieht gut aus. Hilft aber nichts - wenn schon Schrott ankommt, wird auch Schrott verarbeitet.

                                                So long,
                                                 Martin

                                                --
                                                In der Theorie stimmen Theorie und Praxis genau überein.
                                                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                              2. Hello,

                                                der Browser wandelt das um!

                                                Komischwerweise steht es in var_dump (aus dem Glob()) dann wieder in der ursprünglichen Form

                                                POST /upload/filenames.php HTTP/1.1
                                                Host: testserver.lan
                                                User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
                                                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
                                                Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
                                                Accept-Encoding: gzip,deflate
                                                Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
                                                Keep-Alive: 115
                                                Connection: keep-alive
                                                Referer: http://testserver.lan/upload/filenames.php
                                                Content-Type: multipart/form-data; boundary=---------------------------258742437220159
                                                Content-Length: 268
                                                -----------------------------258742437220159
                                                Content-Disposition: form-data; name="text"

                                                Bu&#776;rodatei.txt
                                                -----------------------------258742437220159
                                                Content-Disposition: form-data; name="btn[send]"

                                                senden
                                                -----------------------------258742437220159--

                                                Irritierte Grüße aus dem schönen Oberharz

                                                Tom vom Berg

                                                --
                                                 ☻_
                                                /▌
                                                / \ Nur selber lernen macht schlau
                                                http://bikers-lodge.com
                                                1. Hi,

                                                  der Browser wandelt das um!

                                                  ja, und inzwischen ist mir auch klar, warum: Du hast ISO-8859-1 als Zeichencodierung gewählt (wieso eigentlich?), damit ist U+0308 nicht direkt darstellbar. Der Browser ist also gezwungen, dieses Zeichen in eine Ersatzdarstellung umzuwandeln.

                                                  Komischwerweise steht es in var_dump (aus dem Glob()) dann wieder in der ursprünglichen Form

                                                  Das macht aber auch der Browser. Vom Server kommt's wieder als NCR. Absolution für PHP?

                                                  Ciao,
                                                   Martin

                                                  --
                                                  Realität ist eine Illusion, die durch Unterversorgung des Körpers mit Alkohol entstehen kann.
                                                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                                  1. Hello,

                                                    ja, und inzwischen ist mir auch klar, warum: Du hast ISO-8859-1 als Zeichencodierung gewählt (wieso eigentlich?), damit ist U+0308 nicht direkt darstellbar. Der Browser ist also gezwungen, dieses Zeichen in eine Ersatzdarstellung umzuwandeln.

                                                    Stimmt. Der Lokale Xampp ist noch auf ISO... Sowas Dummes!
                                                    Ich habe es jetzt geändert.

                                                    http://selfhtml.bitworks.de/bilder/filenames_form.png
                                                    http://selfhtml.bitworks.de/bilder/filenames_explorer.png

                                                    Wenn jetzt auch noch im Windows-Datei-Explorer vernünftige Zeichen ankämen, wäre es gut.

                                                    Das Problem von Hawk ist aber noch da...

                                                    Merkwürdigerweise erscheint der Dateiname im Input-Feld des Forms nun in eine lesbaren Darstellung.

                                                    Und es muss noch eine Funktion her, die "verbotene Zeichen" verhindert, damit PHP nicht aussteigt. Das, was ich aus Versehen produziert habe mit der falschen Kodierung der Seite kann man schließlich auch absichtlich tun.

                                                    Liebe Grüße aus dem schönen Oberharz

                                                    Tom vom Berg

                                                    --
                                                     ☻_
                                                    /▌
                                                    / \ Nur selber lernen macht schlau
                                                    http://bikers-lodge.com
                              2. Hallo Tom,

                                ich habe jetzt auch mal deine Funktion "tohex" verwendet.

                                Wenn ich die Datei "für.ps" hochlade wird mir dies ausgegeben.

                                  
                                $file_name= $_FILES['fileuploads']['name'][$i];  
                                echo tohex($file_name);  
                                
                                

                                66 c3 bc 72 2e 70 73

                                Für das ü wird dann wohl c3 und bc ausgegeben wenn die Webseite in utf8 ausliefert?

                                vielen Dank und viele Grüße
                                hawk

                                1. Hallo,

                                  Für das ü wird dann wohl c3 und bc ausgegeben wenn die Webseite in utf8 ausliefert?

                                  korrekt, das ist die Repräsentation des Zeichens ü (U+00FC) in UTF-8.

                                  Ciao,
                                   Martin

                                  --
                                  Was du heute kannst besorgen,
                                  das geht sicher auch noch morgen.
                                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                  1. Hallo Martin,

                                    danke dir.

                                    Hast du irgendwo eine Webseite wo man eine Übersicht darüber findet?
                                    Ich hatte auf
                                    http://www.ascii-code.com/

                                    nachgeschaut, aber hier wird für das kleine ü der Hexcode FC angegeben.

                                    Bei einer Testdatei - für.pdf - mit dem "normalisierten" ü vom MAC wird mir mit Tom's hex Funktion folgendes ausgegeben.

                                    66 75 cc 88 72 2e 70 64 66

                                    also praktisch für das ü den Hexcode 75 cc 88

                                    Vielleicht könnte man auf diese Weise vorher prüfen, wie eine Datei kodiert ist und dann entsprechend weiter behandeln?

                                    vielen Dank und viele Grüße
                                    hawk

                                    1. Hello,

                                      Bei einer Testdatei - für.pdf - mit dem "normalisierten" ü vom MAC wird mir mit Tom's hex Funktion folgendes ausgegeben.

                                      66 75 cc 88 72 2e 70 64 66

                                      also praktisch für das ü den Hexcode 75 cc 88

                                      Vielleicht könnte man auf diese Weise vorher prüfen, wie eine Datei kodiert ist und dann entsprechend weiter behandeln?

                                      Das haben wir schon mal ziemlich ausführlich behandelt. Such mal nach

                                      "category:php is_utf8" oder
                                      "category:php isutf8" oder

                                      im Archiv. kann aber schon 2006 aufwärts gewesen sein...

                                      Die Funktion stellt fest, ob der vorliegende Stream in utf-8 codiert sein kann, bzw. ob es bei der Interpretation keine Fehler gibt und gibt die max. Anzahl der verwendeten Oktetten pro Zeichen an. Das lässt auch gewisse Rückschlüsse zu.

                                      Sicher ist da natürlich nichts so wirklich. Aber das geht aus den Threads zum Thema auch hervor.

                                      Auch auf die Gefahr, dass ich nerve:

                                      Der Wert aus $_FILES[$fileupload]['name'][$i] darf man NIEMALS NIE NICHT direkt als Dateinamen verwenden!

                                      Da gehört mindestens ein

                                        
                                      $filename = basename($_FILES[$fileupload]['name'][$i]);  
                                        
                                      
                                      

                                      drum herum.

                                      Und außerdem kannst Du dein ganzes Problem beseitigen, wenn Du dich entschließt, den Dateinamen aus $filename = basename($_FILES[$fileupload]['name'][$i]) in eine Datenbank zu schreiben und die Datei dann "$id.$extension" nennst.

                                      Eine Extension ermittelst Du aus dem realen MIMEType, den Du auch erst auf dem Server ermittelst.

                                      Schau die mal den Artikel im Wiki dazu an. Ist noch nicht fertig, aber das wichtigste steht drin!
                                      http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload

                                      Liebe Grüße aus dem schönen Oberharz

                                      Tom vom Berg

                                      --
                                       ☻_
                                      /▌
                                      / \ Nur selber lernen macht schlau
                                      http://bikers-lodge.com
                                      1. Hallo Tom,

                                        Auch auf die Gefahr, dass ich nerve:

                                        Auf keinen Fall. Im Gegenteil, ich bin für jeden Hinweis dankbar!

                                        Da gehört mindestens ein

                                        $filename = basename($_FILES[$fileupload]['name'][$i]);

                                        
                                        > drum herum.  
                                          
                                        Ich hoffe du schlägst mich nicht :-)  
                                        Aber warum das basename() ?  
                                          
                                        $filenamebase = basename($\_FILES['fileuploads']['name'][$i]);  
                                        echo "der name als base ist $filenamebase <br>";  
                                          
                                        Hier wird mir im Browser doch auch wieder nur der Dateiname "für.ps" angezeigt?  
                                          
                                        vielen Dank und viele Grüße  
                                        hawk
                                        
                                        1. Hallo

                                          Ich hoffe du schlägst mich nicht :-)
                                          Aber warum das basename() ?

                                          Ich glaube du meinst dies wegen Sicherheitsgründen allgemein oder?
                                          Ich dachte zuerst du meinst das im Zusammenhang mit dem Umlaute Problem.

                                          Vielleicht ist noch folgendes interessant zu basenname() ?

                                          http://www.phpgangsta.de/vorsicht-bei-der-basename-funktion-und-umlauten

                                          vielen Dank und viele Grüße
                                          hawk

                                          1. Hallo

                                            Vielleicht ist noch folgendes interessant zu basenname() ?

                                            http://www.phpgangsta.de/vorsicht-bei-der-basename-funktion-und-umlauten

                                            Hast du denn mal testweise vardump(setlocale(NewEntry)) ausgeführt und geschaut, was dein Hoster da vorgibt? Die Beschreibung des Problems in dem Beitrag ähnelt ja dem deinen Problem in gewisser Weise.

                                            Tschö, Auge

                                            --
                                            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                                            Terry Pratchett, "Wachen! Wachen!"
                                            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                                            Veranstaltungsdatenbank Vdb 0.3
                                            1. Hallo Auge,

                                              Ich habe ja einen XAMPP unter Win 7 (32bit)

                                                
                                              setlocale(LC_ALL, 'en_US.UTF8');  
                                                
                                              var_dump(setlocale(LC_ALL, 0));  
                                              
                                              

                                              Bringt mir immer ein;

                                              string(1) "C"

                                              zurück.
                                              Offensichtlich greift das auf einem Windows System nicht. Zumindest gibt es im Manual einige User Hinweise dazu.

                                              vielen Dank und viele Grüße
                                              hawk

                                              1. Hallo

                                                Ich habe ja einen XAMPP unter Win 7 (32bit)

                                                setlocale(LC_ALL, 'en_US.UTF8');

                                                var_dump(setlocale(LC_ALL, 0));

                                                
                                                >   
                                                > Bringt mir immer ein;  
                                                >   
                                                > string(1) "C"  
                                                >   
                                                > zurück.  
                                                > Offensichtlich greift das auf einem Windows System nicht. Zumindest gibt es im Manual einige User Hinweise dazu.  
                                                  
                                                [Der Blogeintrag](http://www.phpgangsta.de/vorsicht-bei-der-basename-funktion-und-umlauten) sagt ja, dass man irgendeine mehrbytefähige Locale einstellen soll. Die dort gezeigten Pfadangaben weisen auf ein unixoides OS hin. Wenn ich nun deine Einlassung richtig interpretiere, will das unter Windows nicht so, wie im Blogeintrag beschrieben. [Die Manualseite zu setlocale](http://us1.php.net/manual/de/function.setlocale.php) gibt aber einen Hinweis.  
                                                  
                                                <zitat>Unter Windows setzt `setlocale(LC_ALL, '')`{:.language-php} die Locale Namen aus den Regional/Sprache Einstellungen des Systems; (erreichbar über die Systemsteuerung).</zitat>  
                                                  
                                                … und ein [Windows-Beispiel](http://us1.php.net/manual/de/function.setlocale.php#example-4728) solwie mehrere Hinweise und Links zu den besonderen Erfordernissen von Windows.  
                                                  
                                                Wenn du nicht ein asbachuraltes Windows nutzt, sollte die systemseitige Einstellung mehrbytefähig sein. Probier das mal bitte (falls du's noch nicht getan haben solltest).  
                                                  
                                                Tschö, Auge  
                                                
                                                -- 
                                                Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.  
                                                Terry Pratchett, "Wachen! Wachen!"  
                                                  
                                                ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}  
                                                  
                                                [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
                                                
                                                1. Hallo Auge,

                                                  danke nochmals für deine Hilfe.

                                                  also wenn ich es so versuche wie im Manual Beispiel:

                                                    
                                                  setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');  
                                                  
                                                  

                                                  Bekomme ich die Ausgabe
                                                  string(19) "German_Germany.1252"

                                                  Es ändert sich aber nichts an dem eigentlichen Problem mit dem normalisierten Dateinamen vom Mac und dem ü das aus zwei Zeichen besteht.
                                                  Ich möchte mal noch Tom's Hinweisen zu den alten Foreneinträgen hier zu "php is_utf8" nachgehen, ob ich irgendwie sicher prüfen kann, wenn eine solche normalisierte Datei vorliegt.

                                                  vielen Dank und viele Grüße
                                                  hawk

                                                2. Hello,

                                                  das hat hier schinbar alles keinen Sinn.

                                                  Ich habe eben nochmal

                                                    
                                                  $encoding = mb_convert_variables ('Windows-1252', 'UTF-8', $filename);  
                                                    
                                                  
                                                  

                                                  In das Testscript eingefügt. Nun wurde die Datei "Böser-Übeltäter-04.txt" einwandfrei angelegt im NTFS, also ohne kryptische Zeichen in der Sicht, aber PHP kommt damit wieder nicht klar beim Auswerten. Unter Windows kann man dann mit der Datei auch einwandfrei arbeiten.

                                                  Im GLOB-Array ist der Name laut var_dump($_filenames) zwar noch enthalten, geht man das Array aber mit

                                                    
                                                  foreach ($_filelist as $key => $value)  
                                                  {  
                                                  	$filenames_html .= htmlspecialchars("[$key] => $value\r\n");  
                                                  }  
                                                    
                                                  
                                                  

                                                  durch, wird der Index einfach übergangen.

                                                  Da muss also ein Bug in PHP vorhanden sein. Es kann ja nicht angehen, dass man Werte auf ganz legitimen Wegen ins System hineinbekommt, die dann aber auf der einen Seite auch vorhanden sind und auf der anderen zu schweren Fehlern führen.

                                                    
                                                  ERGO: Keine NICHT-ASCII-Zeichen für Dateinamen. Das macht nur Ärger!  
                                                    
                                                  
                                                  

                                                  Liebe Grüße aus dem schönen Oberharz

                                                  Tom vom Berg

                                                  --
                                                   ☻_
                                                  /▌
                                                  / \ Nur selber lernen macht schlau
                                                  http://bikers-lodge.com
                                                  1. Hello,

                                                    Ich habe eben nochmal

                                                    $encoding = mb_convert_variables ('Windows-1252', 'UTF-8', $filename);

                                                    
                                                    >   
                                                    > In das Testscript eingefügt.  
                                                      
                                                    Ergebnis:  
                                                      
                                                    ![](http://selfhtml.bitworks.de/bilder/filenames-win-1252.png)  
                                                      
                                                      
                                                      
                                                      
                                                      
                                                    Liebe Grüße aus dem schönen Oberharz  
                                                      
                                                      
                                                    Tom vom Berg  
                                                    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                                                      
                                                    
                                                    -- 
                                                     ☻\_  
                                                    /▌  
                                                    / \ Nur selber lernen macht schlau  
                                                    <http://bikers-lodge.com>
                                                    
                                                    1. Hello,

                                                      ich habe mich mal daran gemacht, eine "Kastrationsfunktion" in PHP zu erstellen.
                                                      Leider habe ich mit Multibyte und Singlebyte nun total verhaspelt.

                                                      Was wird zum Vergleich wann wo wie gespeichert und verglichen?

                                                      Es gibt kein "mb_str_replace()", Aber ich kann auch keine Zeichen dediziert in einer Codierung vorgeben. Die fehlenden Funktionen hatten wir in einem anderen Thread. Dazu fehlen mir einfach die Informatonen über die Codepoints und passende Funktionen dazu, um daraus eine Bytefolge zu machen. Und dann sind wir schon bald wieder soweit unten , ob da Big-Endian oder Little-Endian gespeichert wird usw.

                                                      Bisher hatte ich diesen Fahrplan

                                                      * Umlaute entfernen bzw. ersetzen
                                                          * kein führender Punkt
                                                          * keine Pfade zulassen ('' und '/' entfernen bzw. austauschen)
                                                          * alle nicht in einer Positivliste enthaltenen Zeichen ersetzen.
                                                          * Dateiendungen (*.ext) kontrollieren und ggf. ersetzen oder ablehnen

                                                      Es müssen aber die Codierungen für die Namensübertragung, die Scripte, die Progammerstellung etc. beachtet werden. Hier passiert mir noch zuviel automatsich an Stellen, die ich noch nicht auf dem Schirm habe.

                                                        
                                                      function castrate_name($name)  
                                                      {  
                                                        
                                                      	static $file_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-+_ ~!#$%&(),@[]{}';  
                                                        
                                                          $_search1  = array(' ', 'ä', 'ö', 'ü', 'ß', 'Ä', 'Ö', 'Ü', '/', '\\');  
                                                          $_replace1 = array('_', 'ae', 'oe', 'ue', 'ss', 'Ae', 'Oe', 'Ue', '-', '-');  
                                                      	$_search2  = array('<', '>', '?', '"', ':', '|', '*');  
                                                      	$replace2 = '#';  
                                                      	  
                                                      	$name = str_replace($_search1, $_replace1, $name);  
                                                      	$name = str_replace($_search2, $replace2, $name);  
                                                      	  
                                                          $len = mb_strlen ($name);  
                                                      	  
                                                      	### Verwirrung  
                                                      	  
                                                      	  
                                                      	  
                                                      	  
                                                          return $newname;  
                                                      }  
                                                        
                                                      
                                                      

                                                      Liebe Grüße aus dem schönen Oberharz

                                                      Tom vom Berg

                                                      --
                                                       ☻_
                                                      /▌
                                                      / \ Nur selber lernen macht schlau
                                                      http://bikers-lodge.com
                                                      1. Lieber Tom,

                                                        ich habe mir mit Hilfe des SELFHTML-Forumsarchivs folgende Klasse gebaut. Vielleicht nützt sie Dir ja etwas?

                                                        <?php  
                                                        /**  
                                                         * UTF-8 Ensurer  
                                                         *  
                                                         * This class is for making sure some string data is  
                                                         * encoded in UTF-8.  
                                                         *  
                                                         * Felix Riesterer (http://felix-riesterer.de)  
                                                         */  
                                                          
                                                          
                                                        class UTF8_Ensurer {  
                                                        	public  function ensure ($s) {  
                                                        		if (is_string($s) && !$this->is_utf8($s)) {  
                                                        			$s = utf8_encode($s);  
                                                        		}  
                                                          
                                                        		return $s;  
                                                        	}  
                                                          
                                                        	public  function iso ($s) {  
                                                        		if (is_string($s) && $this->is_utf8($s)) {  
                                                        			$s = utf8_decode($s);  
                                                        		}  
                                                          
                                                        		return $s;  
                                                        	}  
                                                          
                                                        	/* check for UTF-8 encoding: the following set of functions  
                                                        	 * has been taken (and adapted) from SELFHTML-Forum archive  
                                                        	 * http://forum.de.selfhtml.org/archiv/2005/10/t116805/#m747567  
                                                        	 */  
                                                        	public  function is_utf8 ($s) {  
                                                        		$t = $this;  
                                                          
                                                        		$len = strlen($s);  
                                                        		$i = 0;  
                                                          
                                                        		while ($i < $len) {  
                                                          
                                                        			$c = ord($s{$i++});  
                                                          
                                                        			if ($t->valid_1byte($c)) { // continue  
                                                        				continue;  
                                                          
                                                        			} elseif ($t->valid_2byte($c)) { // check 1 byte  
                                                          
                                                        				if ($i >= $len || !$t->valid_nextbyte(ord($s{$i++})))  
                                                        					return false;  
                                                          
                                                        			} elseif ($t->valid_3byte($c)) { // check 2 bytes  
                                                          
                                                        				if ($i >= $len || !$t->valid_nextbyte(ord($s{$i++})))  
                                                        					return false;  
                                                          
                                                        				if ($i >= $len || !$t->valid_nextbyte(ord($s{$i++})))  
                                                        					return false;  
                                                          
                                                        			} elseif ($t->valid_4byte($c)) { // check 3 bytes  
                                                          
                                                        				if ($i >= $len || !$t->valid_nextbyte(ord($s{$i++})))  
                                                        					return false;  
                                                          
                                                        				if ($i >= $len || !$t->valid_nextbyte(ord($s{$i++})))  
                                                        					return false;  
                                                          
                                                        				if ($i >= $len || !$t->valid_nextbyte(ord($s{$i++})))  
                                                        					return false;  
                                                          
                                                        			} else {  
                                                          
                                                        				return false; // 10xxxxxx occuring alone  
                                                        			} // goto next char  
                                                        		}  
                                                          
                                                        		return true; // done  
                                                        	}  
                                                          
                                                        	private function valid_1byte ($c) {  
                                                        		if (!is_int($c))  
                                                        			return false;  
                                                        		return ($c & 0x80)==0x00;  
                                                        	}  
                                                          
                                                        	private function valid_2byte ($c) {  
                                                        		if (!is_int($c))  
                                                        			return false;  
                                                        		return ($c & 0xE0)==0xC0;  
                                                        	}  
                                                          
                                                        	private function valid_3byte ($c) {  
                                                        		if (!is_int($c))  
                                                        			return false;  
                                                        		return ($c & 0xF0)==0xE0;  
                                                        	}  
                                                          
                                                        	private function valid_4byte ($c) {  
                                                        		if (!is_int($c))  
                                                        			return false;  
                                                        		return ($c & 0xF8)==0xF0;  
                                                        	}  
                                                          
                                                        	private function valid_nextbyte ($c) {  
                                                        		if (!is_int($c))  
                                                        			return false;  
                                                        		return ($c & 0xC0)==0x80;  
                                                        	}  
                                                        }  
                                                          
                                                        ?>
                                                        

                                                        Dazu noch dieses Schmankerl aus eigener Produktion:

                                                        	public  function normalize_utf8_to_lower_case ($s) {  
                                                        		// replacements for lower-case ASCII-characters  
                                                        		$r = array(  
                                                        			'a'  => 'AaÀÁÂÃÅàáâãåĀāĂ㥹ǍǎǺǻẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặΆ',  
                                                        			'ae' => 'ÄäæÆǼǽ',  
                                                        			'b'  => 'bB',  
                                                        			'c'  => 'CcÇçĆćĈĉĊċČč',  
                                                        			'd'  => 'DdÐĎďĐđ',  
                                                        			'e'  => 'EeÈÉÊËèéêëĒēĔĕĖėĘęĚěẸẹẺẻẼẽẾếỀềỂểỄễỆệΈ',  
                                                        			'f'  => 'Ffƒ',  
                                                        			'g'  => 'GgĜĝĞğĠġĢģ',  
                                                        			'h'  => 'HhĤĥĦħΉ',  
                                                        			'i'  => 'IiÌÍÎÏìíîïĨĩĪīĬĭĮįİıǏǐỈỉỊịΊΐ',  
                                                        			'ij' => 'IJij',  
                                                        			'j'  => 'JjĴĵ',  
                                                        			'k'  => 'KkĶķĸ',  
                                                        			'l'  => 'LlĹĺĻļĽľĿŀŁł',  
                                                        			'm'  => 'Mm',  
                                                        			'n'  => 'NnÑñŃńŅņŇňʼn',  
                                                        			'ng' => 'Ŋŋ',  
                                                        			'o'  => 'OoÒÓÔÕØòóôõøŌōŎŏŐőƠơǑǒǾǿΌỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợ',  
                                                        			'oe' => 'ÖöŒœ',  
                                                        			'p'  => 'Pp',  
                                                        			'q'  => 'Qq',  
                                                        			'r'  => 'RrŔŕŖŗŘř',  
                                                        			's'  => 'SsŚśŜŝŞşŠš',  
                                                        			'ss' => 'ßß',  
                                                        			't'  => 'TtŢţŤťŦŧ',  
                                                        			'u'  => 'UuÙÚÛŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜùúûỤụỦủỨứỪừỬửỮữỰự',  
                                                        			'ue' => 'Üü',  
                                                        			'v'  => 'Vv',  
                                                        			'w'  => 'WwŴŵẀẁẂẃẄẅ',  
                                                        			'x'  => 'Xx',  
                                                        			'y'  => 'YyÝýÿŶŷŸΎỲỳỴỵỶỷỸỹ',  
                                                        			'z'  => 'ZzŹźŻżŽž'  
                                                        		);  
                                                          
                                                        		// replace  
                                                        		foreach ($r as $c => $variants) {  
                                                        			$s = preg_replace("~[$variants]~su", $c, $s);  
                                                        		}  
                                                          
                                                        		return $s;  
                                                        	}
                                                        

                                                        Wenn es Dein Problem nicht löst, dann brauchst Du vielleicht eine neue Betrachtungsweise darauf?

                                                        Liebe Grüße,

                                                        Felix Riesterer.

                                                        --
                                                        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                                                        1. Hello leiber Felix,

                                                          ich habe mir mit Hilfe des SELFHTML-Forumsarchivs folgende Klasse gebaut. Vielleicht nützt sie Dir ja etwas?

                                                          Du weißt, dass ich Dich und deine Beiträge sehr schätze?

                                                          Dann wirst Du mir aber sicherlich auch glauben, dass ich die Klasse und ihren Nutzen nicht in 10 Minuten durchschauen werde? Wenn ich das könnte, wäre es auch keine Klasse von Dir ;-)

                                                          Ob sie allerdings meinem (und auch teilweise Hawkmasters) Problem helfen kann, weiß ich auch noch nicht. Ich befürchte, dass wir alle zusammen noch nicht erkannt haben, wo das eigentliche Problem steckt.

                                                          Da dieser Thread nach meinem Empfinden garantiert archiviert wird, geht auch die Klasse nicht verloren.

                                                          Wir werden hier mMn noch viel mehr Mitleser bekommen, als wir das heute schon übersehen können.

                                                          Liebe Grüße aus dem schönen Oberharz

                                                          Tom vom Berg

                                                          --
                                                           ☻_
                                                          /▌
                                                          / \ Nur selber lernen macht schlau
                                                          http://bikers-lodge.com
                                                          1. Om nah hoo pez nyeetz, Tom!

                                                            Da dieser Thread nach meinem Empfinden garantiert archiviert wird, geht auch die Klasse nicht verloren.

                                                            Grundsätzlich werden ersteinmal alle Threads archiviert.
                                                            Es ist ein Ausnahmefall, wenn ein Thread nicht archiviert werden sollte. Die sind dann an einem Icon erkennbar.

                                                            Matthias

                                                            --
                                                            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Sand und Sandwich.

                                                        2. Lieber Felix, Hallo zusammen,

                                                          ich kann mit eurem Expertenwissen nicht mithalten. Trotzdem lese ich hier natürlich fleisig weiter mit und versuche auch das eine oder andere.

                                                          Ich habe nun mal zum testen, Felix's Klasse in meinen Dateiumpload Vorgang eingebaut.

                                                            
                                                          $test = new UTF8_Ensurer();  
                                                          $myVar = $test -> ensure($_FILES['fileuploads']['name'][$i]);  
                                                          echo "Ensure ist " . $myVar;  
                                                          echo "<hr>";  
                                                          $myVar = $test -> iso($_FILES['fileuploads']['name'][$i]);  
                                                          echo "Iso ist " . $myVar;  
                                                          
                                                          

                                                          Ich wähle diese normalisierte Datei "für.pdf" aus. Im Browser wird mir dann folgendes angezeigt.

                                                          Ensure ist für.pdf
                                                          Iso ist fu?r.pdf

                                                          Ich habe es so verstanden das diese normalisierten Zeichen eigentlich in Windows gültig sind.
                                                          Wenn ich nun aber ein CMD Dosfenster aufmache und einen "Dir" eingebe, wird mir die Datei auch so angezeigt.
                                                          fu¨r.pdf

                                                          Bei anderen Dateien mit Umlauten ist dies jedoch nicht der Fall. Ist das weil das Dosfenster eine andere Codepage hat?

                                                          vielen Dank und viele Grüße
                                                          hawk

                                                          1. Moin hawkmaster,

                                                            es gibt für einige Zeichen mehrere Arten, sie in Unicode darzustellen. Z.B. der Umlaut „Ü“ lässt sich darstellen als

                                                            • den den Buchstaben Ü selber (LATIN CAPITAL LETTER U WITH DIAERESIS, U+00DC)
                                                            • die Zusammensetzung des Buchstaben U (LATIN CAPITAL LETTER U, U+0055) und ¨ (COMBINING DIAERESIS, U+0308)

                                                            Beide sind äquivalent (wenn auch nicht gleich). Die Umformung in eine der beiden Formen für die ganze Zeichenkette nennt man „Normalisierung.“ Was du also willst ist die Normalisierung in eine der Formen – vorzugsweise NFC, wenn du mit Windows arbeitest, da IIRC sowohl OS X als auch Linux damit klarkommen.

                                                            In PHP kannst du das, wie bereits erwähnt, mit der Normalizer-Klasse machen.

                                                            LG,
                                                             CK

                                                            1. Hello Christian,

                                                              In PHP kannst du das, wie bereits erwähnt, mit der Normalizer-Klasse machen.

                                                              Danke für den Tipp.

                                                              So ganz verstanden habe ich den Umgang damit noch nicht, aber ich werde mal üben ;-)

                                                              Liebe Grüße aus dem schönen Oberharz

                                                              Tom vom Berg

                                                              --
                                                               ☻_
                                                              /▌
                                                              / \ Nur selber lernen macht schlau
                                                              http://bikers-lodge.com
                                                            2. Hallo Christian,

                                                              vielen Dank nochmals für die Erklärung zur Normalizer Klasse.
                                                              Mir geht es aber wie Tom. So ganz verstanden habe ich das noch nicht.

                                                              Ich hatte es nämlich gleich auf dein erstes Posting hin ausprobiert

                                                              Ich habe es jetzt eben nochmals versucht wie im Manual und zwar mit der Datei vom Mac mit Buchstaben U (LATIN CAPITAL LETTER U, U+0055) und ¨ (COMBINING DIAERESIS, U+0308

                                                              echo ( normalizer_is_normalized($_FILES['fileuploads']['name'][$i], Normalizer::FORM_C) ) ? "normalized" : "not normalized";

                                                              Die Ausgabe ist dann "not normalized". Bei einer anderen Datei mit normalen ü kommt "normalized".

                                                              Das wäre ja schon mal gut um herauszufinden wenn man solch eine Datei vorliegen hat. Was ich nun nicht ganz verstehe: Wie könnte man auf Dateiebene den Dateinamen umwandeln, also dieses
                                                              (LATIN CAPITAL LETTER U, U+0055) und ¨ (COMBINING DIAERESIS, U+0308
                                                              in
                                                              (LATIN CAPITAL LETTER U WITH DIAERESIS, U+00DC)

                                                              um wandeln?

                                                              vielen Dank und viele Grüße
                                                              hawk

                                                              1. Moin hawkmaster,

                                                                Das wäre ja schon mal gut um herauszufinden wenn man solch eine Datei vorliegen hat.

                                                                Irrelevant, schieb einfach den String jedesmal durch den Normalizer. Der ist deterministisch.

                                                                Was ich nun nicht ganz verstehe: Wie könnte man auf Dateiebene den Dateinamen umwandeln, also dieses
                                                                (LATIN CAPITAL LETTER U, U+0055) und ¨ (COMBINING DIAERESIS, U+0308
                                                                in
                                                                (LATIN CAPITAL LETTER U WITH DIAERESIS, U+00DC)

                                                                um wandeln?

                                                                Wie gesagt, mit der Normalizer-Klasse. Nochmal ein Beispiel:

                                                                  
                                                                $var = "Ü"; # LATIN CAPITAL LETTER U WITH DIAERESIS  
                                                                $var1 = "U\xcc\x88"; # LATIN CAPITAL LETTER U + COMBINING DIAERESIS  
                                                                  
                                                                echo bin2hex($var), " - ", bin2hex($var1), "\n";  
                                                                  
                                                                $var = normalizer_normalize($var, Normalizer::FORM_C);  
                                                                $var1 = normalizer_normalize($var1, Normalizer::FORM_C);  
                                                                  
                                                                echo bin2hex($var), " - ", bin2hex($var1), "\n";  
                                                                
                                                                

                                                                LG,
                                                                 CK

                                                                1. Hallo Chrisitan,

                                                                  unglaublich!, jetzt hat man doch noch eine Lösung gefunden.

                                                                    
                                                                  $var1 = normalizer_normalize($_FILES['fileuploads']['name'][$i], Normalizer::FORM_C);  
                                                                  $file_name = utf8_decode($var1);//das utf8_decode hier nur damit die Datei auch im Windows Verzeichnis sauber aussieht.  
                                                                    
                                                                  
                                                                  

                                                                  Nun klappt der Dateiupload ohne Fehler und die Datei im Windows Verzeichnis sieht auch gut aus.

                                                                  Allen nochmals herzlichen Dank für die tolle Hilfe.

                                                                  vielen Dank und viele Grüße
                                                                  hawk

                                                                  1. Vielleicht zur Ergänzung für andere die noch nicht mit dem Normalizer gearbeitet haben.
                                                                    Man muss auf Windows die Extesnsion

                                                                    php_int.dll in der php.ini aktivieren.

                                                                    vielen Dank und viele Grüße
                                                                    hawk

                                                                    1. Hello,

                                                                      Vielleicht zur Ergänzung für andere die noch nicht mit dem Normalizer gearbeitet haben.
                                                                      Man muss auf Windows die Extesnsion

                                                                      php_intl.dll in der php.ini aktivieren.

                                                                      Das hat leider nicht gereicht bei mir.

                                                                      Wo liegen denn deine icu*.ddl-Dateien?

                                                                      Liebe Grüße aus dem schönen Oberharz

                                                                      Tom vom Berg

                                                                      --
                                                                       ☻_
                                                                      /▌
                                                                      / \ Nur selber lernen macht schlau
                                                                      http://bikers-lodge.com
                                                                      1. Hello,

                                                                        Hello,

                                                                        Vielleicht zur Ergänzung für andere die noch nicht mit dem Normalizer gearbeitet haben.
                                                                        Man muss auf Windows die Extesnsion

                                                                        php_intl.dll in der php.ini aktivieren.

                                                                        Das hat leider nicht gereicht bei mir.

                                                                        Wo liegen denn deine icu*.dll-Dateien?

                                                                        Dieses Feature ist ein Bug.

                                                                        Die icu*.dll-Dateien müssen in das Verzeichnis  \programme\xampp\apache\bin oder wo der Xamp sonst wohnt, kopiert werden. Dann funktioniert es.

                                                                        siehe:
                                                                        https://www.youtube.com/watch?v=ve_b8cVfV-o

                                                                        Wie soll man darauf kommen?

                                                                        Liebe Grüße aus dem schönen Oberharz

                                                                        Tom vom Berg

                                                                        --
                                                                         ☻_
                                                                        /▌
                                                                        / \ Nur selber lernen macht schlau
                                                                        http://bikers-lodge.com
                                                                        1. Hello Gunnar,

                                                                          könntest Du mich bitte mal von meinen Unwissenheits-Qualen erlösen?

                                                                          Nun funktioniert der Normalizer auch bei mir im Xampp unter WinDOS endlich (Linux war kein Problem) und ich würde gerne ein paar Schritte weiterkommen mit meiner "filename_filer()"-Funktion.

                                                                          Aber ich verstehe die Bedeutung und die Wirkung der Abbildungsvorschriften nicht und was da passiert.

                                                                          * Normalization Form D (NFD) - Canonical Decomposition
                                                                              * Normalization Form C (NFC) - Canonical Decomposition followed by Canonical Composition
                                                                              * Normalization Form KD (NFKD) - Compatibility Decomposition
                                                                              * Normalization Form KC (NFKC) - Compatibility Decomposition followed by Canonical Composition

                                                                          aus: http://de2.php.net/manual/de/class.normalizer.php

                                                                          Auch der Wikipedia-Artikel hilft mir nicht mehr. Da fehlen mir einfach ein paar Begriffe in meinem Verständnis. Was ist eine kononische Zerlegung, was ist eine kompatible Zerlegung?

                                                                          https://de.wikipedia.org/wiki/Normalisierung_(Unicode)

                                                                          Christian hatte "FORM_C" empfohlen.
                                                                          https://forum.selfhtml.org/?t=217033&m=1490601

                                                                          akniep@rayo.info hat in den UCN von PHP
                                                                          http://de2.php.net/manual/de/normalizer.normalize.php#92592
                                                                          den Typ "FORM_D" benutzt und noch eine Reihe von Ersetzungen selber durchgeführt.

                                                                          Im Prinzip komme ich damit zum Ziel, zumal ja noch etliche Teilstrings (Gerätenamen, Anweisungszeichen, usw.) aus dem zukünftigen Dateinamen entfernt werden müssen.

                                                                          Ich würde aber gerne verstehen, was da im Normalizer passiert. Zunächst benötige ich aber vermutlich etwas Vokabeltraining *puh*.

                                                                          Könntest Du dazu bitte mal etwas ausführlicher "für Doofe" Stellung nehmen?

                                                                          Liebe Grüße aus dem schönen Oberharz

                                                                          Tom vom Berg

                                                                          --
                                                                           ☻_
                                                                          /▌
                                                                          / \ Nur selber lernen macht schlau
                                                                          http://bikers-lodge.com
                                                                          1. @@Tom:

                                                                            nuqneH

                                                                            Aber ich verstehe die Bedeutung und die Wirkung der Abbildungsvorschriften nicht und was da passiert.

                                                                            * Normalization Form D (NFD) - Canonical Decomposition
                                                                                * Normalization Form C (NFC) - Canonical Decomposition followed by Canonical Composition
                                                                                * Normalization Form KD (NFKD) - Compatibility Decomposition
                                                                                * Normalization Form KC (NFKC) - Compatibility Decomposition followed by Canonical Composition

                                                                            Hilft [UAX15]?

                                                                            Qapla'

                                                                            --
                                                                            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                                                                            1. Hello,

                                                                              Aber ich verstehe die Bedeutung und die Wirkung der Abbildungsvorschriften nicht und was da passiert.

                                                                              * Normalization Form D (NFD) - Canonical Decomposition
                                                                                  * Normalization Form C (NFC) - Canonical Decomposition followed by Canonical Composition
                                                                                  * Normalization Form KD (NFKD) - Compatibility Decomposition
                                                                                  * Normalization Form KC (NFKC) - Compatibility Decomposition followed by Canonical Composition

                                                                              Hilft [UAX15]?

                                                                              Das ist zwar auch nur "Teufel gegen Belzebub" aber ich werde mich auch nochmal durchquälen.
                                                                              Auf Reindeutsch(*) wärs mir allerdings lieber gewesen.

                                                                              (*) "Kanonisch", was ist das, hab ich mich gefragt...
                                                                              Jeder benutzt es, keiner erklärt, was er damit wirklich meint.
                                                                              Traditionell, dem Ritual/Protokoll entsprechend? Wie lautet das Protokoll?

                                                                              Liebe Grüße aus dem schönen Oberharz

                                                                              Tom vom Berg

                                                                              --
                                                                               ☻_
                                                                              /▌
                                                                              / \ Nur selber lernen macht schlau
                                                                              http://bikers-lodge.com
                                                                  2. Hello Hawk,

                                                                    unglaublich!, jetzt hat man doch noch eine Lösung gefunden.

                                                                    $var1 = normalizer_normalize($_FILES['fileuploads']['name'][$i], Normalizer::FORM_C);
                                                                    $file_name = utf8_decode($var1);//das utf8_decode hier nur damit die Datei auch im Windows Verzeichnis sauber aussieht.

                                                                    
                                                                    >   
                                                                    > Nun klappt der Dateiupload ohne Fehler und die Datei im Windows Verzeichnis sieht auch gut aus.  
                                                                      
                                                                    Wie hast Du die Klasse denn zum Laufen gebracht?  
                                                                    Ich erhalte immer die Fehlermeldung  
                                                                      
                                                                    ... "konnte nicht gestartet werden... weil icuuc49.dll nicht gefunden wurde "  
                                                                      
                                                                    Die DDLs sind aber vorhanden. Ich vermute jetzt mal, dass sie vom Xampp in einem anderen Verzeichnis gesucht werden?  
                                                                      
                                                                      
                                                                    Das wird jetzt aber auch schon so speziell, dass man das für den Artikel kaum noch benutzen kann. Damit sollen dann schließlich auch normale Anwender zurecht kommen. Nachinstallation ist immer kritisch, insbesondere, weil die "Otto-Normal-Webseitenbetreiber" bei den Providern i.d.R. nicht heran kommen an die Installation.  
                                                                      
                                                                      
                                                                      
                                                                      
                                                                    Liebe Grüße aus dem schönen Oberharz  
                                                                      
                                                                      
                                                                    Tom vom Berg  
                                                                    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                                                                      
                                                                    
                                                                    -- 
                                                                     ☻\_  
                                                                    /▌  
                                                                    / \ Nur selber lernen macht schlau  
                                                                    <http://bikers-lodge.com>
                                                                    
                                                                  3. Hello Hawk,

                                                                    unglaublich!, jetzt hat man doch noch eine Lösung gefunden.

                                                                    $var1 = normalizer_normalize($_FILES['fileuploads']['name'][$i], Normalizer::FORM_C);
                                                                    $file_name = utf8_decode($var1);
                                                                    //utf8_decode hier nur, damit die Datei auch im Windows Verzeichnis sauber aussieht.

                                                                      
                                                                    Damit bin ich noch nicht einverstanden, denn PHP kann die dann nicht wieder lesen.  
                                                                    Das kotzt ab über Umlauten in Dateinamen, die aus Windows stammen.  
                                                                    Solange dieser Bug in PHP nicht behoben ist, musst Du leider bei Windows als Host-OS alle Nicht-ASCII-Zeichen ersetzen.  
                                                                      
                                                                    PHP und Windows vertragen sich sonst nicht.  
                                                                      
                                                                      
                                                                    Die Funktion aus den User Contributed Notes sieht schon ganz gut aus.  
                                                                    Ich muss jetzt nur noch testen, wie ich vorab prüfen kann, ob utf-8 vorliegt, oder iso-8859-1  
                                                                      
                                                                    Theoretisch kommen ja noch dutzende andere Kodierungen in Frage, aber darum sollen sich dann diejenigen kümmern, die die verwenden.  
                                                                      
                                                                      
                                                                      
                                                                      
                                                                    Liebe Grüße aus dem schönen Oberharz  
                                                                      
                                                                      
                                                                    Tom vom Berg  
                                                                    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                                                                      
                                                                    
                                                                    -- 
                                                                     ☻\_  
                                                                    /▌  
                                                                    / \ Nur selber lernen macht schlau  
                                                                    <http://bikers-lodge.com>
                                                                    
                                                        3. @@Felix Riesterer:

                                                          nuqneH

                                                          Dazu noch dieses Schmankerl aus eigener Produktion:

                                                          public  function normalize_utf8_to_lower_case ($s) {  
                                                          
                                                            // replacements for lower-case ASCII-characters  
                                                            $r = array(  
                                                            	'a'  => 'AaÀÁÂÃÅàáâãåĀāĂ㥹ǍǎǺǻẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặΆ',  
                                                            	'ae' => 'ÄäæÆǼǽ',
                                                          
                                                            
                                                          Das ist aber auch nur für Deutsch tauglich. Im Schwedischen wird [å zu aa](http://andrewgelman.com/2014/04/21/ticket-baaaath/), im Finnischen ä zu a …  
                                                            
                                                          Qapla'
                                                          
                                                          -- 
                                                          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                                                          
                                                      2. hi,

                                                        Es gibt kein "mb_str_replace()", Aber ich kann auch keine Zeichen dediziert in einer Codierung vorgeben. Die fehlenden Funktionen hatten wir in einem anderen Thread. Dazu fehlen mir einfach die Informatonen über die Codepoints und passende Funktionen dazu, um daraus eine Bytefolge zu machen.

                                                        Guck auf meine Seite, da steht alles.

                                                        Und dann sind wir schon bald wieder soweit unten , ob da Big-Endian oder Little-Endian gespeichert wird usw.

                                                        Big/Little-Endians bezeichnen eine Byteorder, die spielt bei numerischen Werten eine Rolle, wenn diese in mehr als einem Byte abgebildet sind.

                                                        Bisher hatte ich diesen Fahrplan

                                                        Vergiss nicht die Rückfahrkarte. Falls Du mit der Bahn fährst: Das zweite Loch ist die Entwertung bei fehlender Bahnsteigsperre.

                                                        Sch?ne Gr??e,
                                                        Horst

                                                  2. Hallo zusammen,

                                                    ich glaube ich gebe jetzt auch auf.
                                                    Ich habe es jetzt nochmals mit 3 verschiedenen Funktionen "is_utf8" in Verbindung mit dem normalisierten Dateinamen versucht.

                                                    seems_utf8
                                                    http://de.php.net/manual/de/function.utf8-encode.php#39932

                                                    is_utf8
                                                    http://php.morva.net/manual/en/function.mb-detect-encoding.php#50087

                                                    und eine aus dem Forumarchiv hier:
                                                    valid_utf8
                                                    http://forum.de.selfhtml.org/archiv/2006/3/t124786/#m804276

                                                    Ich kann keine Unterschiede bei den Rückgabewerten feststellen, zwischen einer Datei mit ü auf dem Windowssystem erstellt und einer Datei mit ü das normalisiert ist und vom MAC kommt.

                                                    Danke an Alle für die tolle Hilfe und Infos.

                                                    vielen Dank und viele Grüße
                                                    hawk

                                                    1. Hi,

                                                      Ich habe es jetzt nochmals mit 3 verschiedenen Funktionen "is_utf8" in Verbindung mit dem normalisierten Dateinamen versucht.

                                                      es hilft dir zwar nicht, aber trotzdem nur zur Klarstellung: Was dir Probleme macht, ist die _nicht_ normalisierte Darstellung - also die Darstellung eines Umlauts mit zwei Zeichen (z.B. U+0075, U+0308), die bei der Darstellung kombiniert werden.

                                                      Dein Grundproblem fasse ich mal so zusammen:

                                                      Die "traditionellen" File-API-Funktionen von Windows verwenden als Codierung implizit Windows-1252. Damit sind viele Unicode-Zeichen nicht darstellbar.

                                                      Codierst du Dateinamen, die den vollen Unicode-Zeichenvorrat enthalten könnten, von UTF-8 nach Windows-1252 um, können Zeichen verlorengehen bzw. werden zu '?', weil sie nicht konvertiert werden können.
                                                      Lässt du die Umcodierung bleiben, funktioniert zwar aus PHP-Sicht alles, aber die entstehenden Dateinamen sehen verstümmelt aus, weil jedes Byte des UTF-8-Namens als einzelnes Zeichen gemäß Windows-1252 interpretiert wird.

                                                      Windows bietet auch alternative Funktionen für die File-API an, die einen großen Teil des Unicode-Zeichenvorrats korrekt verarbeiten könnten, weil sie UCS-2 als Codierung verwenden (ähnlich UTF-16). Diese Funktionen kennt aber PHP unter Windows nicht; du müsstest das komplette PHP-Paket also _mit_ der entsprechenden Option selbst neu compilieren.
                                                      Dann hättest du allerdings ein PHP-Build, bei dem Dateinamen immer in UCS-2 übergeben werden *müssen*, und das wäre in den meisten Fällen wieder sehr lästig.

                                                      So long,
                                                       Martin

                                                      --
                                                      In der Theorie stimmen Theorie und Praxis genau überein.
                                                      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                                      1. Hallo Martin,

                                                        vielen Dank für die tolle Zusammenfassung. Genauso verhält es sich.
                                                        Würde ich das "utf8_decode" weglassen, könnte ich die Datei hochladen und sie würde auch im Browser gut aussehen, aber alle Dateien mit Umlauten sehen im Windows Dateisystem "verstümmelt" aus.

                                                        Wenn ich nochmals Zeit und Muße habe versuche ich doch nochmals den Ansatz mit dem Hexcode

                                                        Das normalisierte ü hatte ja den Hexcode 75 cc 88. Das war die einzige Möglichkeit bisher wo ich einen Unterschied im Ergebnis hatte zum _nicht_ normalisierten ü festgestellt hatte.
                                                        Ich bin mir aber nicht sicher, ob dies eine zuverlässige Prüfung ergeben kann.
                                                        Na mal sehen.

                                                        Nochmals vielen Dank an Alle

                                                        so long
                                                        hawk

                                              2. Hello,

                                                setlocale(LC_ALL, 'en_US.UTF8');

                                                var_dump(setlocale(LC_ALL, 0));

                                                
                                                >   
                                                > Bringt mir immer ein;  
                                                >   
                                                > string(1) "C"  
                                                >   
                                                > zurück.  
                                                > Offensichtlich greift das auf einem Windows System nicht. Zumindest gibt es im Manual einige User Hinweise dazu.  
                                                  
                                                Na klasse! Jetzt habe ich den Tab mit meiner fast fertigen Antwort geschlossen...  
                                                Also Kurzform:  
                                                  
                                                setlocale(LC\_ALL, 0)) setzt die Einstellungen auf die Verwendung der Systemvariablen (SETs) zurück und wenn die nicht vorhanden sind, auf irgendeinen (?) Default.  
                                                  
                                                Aber die Verwendung von "de\_DE.UTF-8" hat auch nichts gebracht. Das Problem liegt vermutlich auch bei WinDOOFs. Die API für das Filesystem kennt scheinbar nur Windows-1252. Und wenn man dann seinen String in 1252 übersetzt, um ihn durchzubringen, dürfen vermutlich auch keine reservierten Zeichen mehr enthalten sein oder Gerätebezeichner mehr dabei entstehen.  
                                                  
                                                Ob die alle wirksam werden können (interpretiert werden), habe ich noch nicht durch.  
                                                  
                                                  
                                                Thema  
                                                - reservierte Zeichen  
                                                - Gerätenamen = reservierte Dateinamen  
                                                  
                                                <https://de.wikipedia.org/wiki/Dateiname>  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                Liebe Grüße aus dem schönen Oberharz  
                                                  
                                                  
                                                Tom vom Berg  
                                                ![](http://selfhtml.bitworks.de/Virencheck.gif)  
                                                  
                                                
                                                -- 
                                                 ☻\_  
                                                /▌  
                                                / \ Nur selber lernen macht schlau  
                                                <http://bikers-lodge.com>
                                                
                                                1. Om nah hoo pez nyeetz, Tom!

                                                  Na klasse! Jetzt habe ich den Tab mit meiner fast fertigen Antwort geschlossen...

                                                  Im Firefox gibt es

                                                  Chronik \ kürzlich geschlossene Tabs  
                                                  
                                                  

                                                  Der FF merkt sich den Zustand beim Schließen des Tabs, inklusive Formulareingaben.

                                                  Matthias

                                                  --
                                                  Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Rebe und Rebell.

                                          2. Hello,

                                            Ich hoffe du schlägst mich nicht :-)
                                            Aber warum das basename() ?

                                            Ich glaube du meinst dies wegen Sicherheitsgründen allgemein oder?
                                            Ich dachte zuerst du meinst das im Zusammenhang mit dem Umlaute Problem.

                                            Vielleicht ist noch folgendes interessant zu basenname() ?

                                            http://www.phpgangsta.de/vorsicht-bei-der-basename-funktion-und-umlauten

                                            Das probiere ich nachher gleich nochmal aus. Ich werde berichten.

                                            Da kommt man über Höckschen auf Stöckschen und plötzlich zeichnet sich eine neue Lösung ab? Das wäre ja genial!

                                            Liebe Grüße aus dem schönen Oberharz

                                            Tom vom Berg

                                            --
                                             ☻_
                                            /▌
                                            / \ Nur selber lernen macht schlau
                                            http://bikers-lodge.com
                                          3. Moin hawkmaster,

                                            Ich hoffe du schlägst mich nicht :-)
                                            Aber warum das basename() ?

                                            Ich glaube du meinst dies wegen Sicherheitsgründen allgemein oder?

                                            Weil, je nach Browser-Version und Betriebssystem, nicht für.pdf ankommt sondern z.B. c:\pfad\für.pdf.

                                            Am sinnvollsten wäre es aber, wenn du die Datei gar nicht mit dem „Original-Namen“ speicherst, sondern mit einer UUID als Dateiname und das Mapping UUID<=>Dateiname in einer Datenbank oder so speicherst. Damit umgehst du dann auch das Problem, dass verschiedene User unabsichtlich eine Datei überschreiben, die bereits hochgeladen wurde. Und das Umlaute-Problem erledigt sich auch von selbst…

                                            LG,
                                             CK

    2. Hallo

      also wenn ich die Datei "Das+ist~mit@sönderZüchenß&.ps" mit rawurlencode() umwandle wird mir im Browser z.b.

      Das%2Bist~mit%40s%C3%B6nderZ%C3%BCchen%C3%9F%26.ps

      angezeigt.

      vielen Dank und viele Grüße
      hawk

      1. Hallo

        also wenn ich die Datei "Das+ist~mit@sönderZüchenß&.ps" mit rawurlencode() umwandle wird mir im Browser z.b.

        Das%2Bist~mit%40s%C3%B6nderZ%C3%BCchen%C3%9F%26.ps

        angezeigt.

        Sieht schlüssig aus. Wie wird die Zeichenkette im Browser ohne rawurlencode angezeigt? Du berichtetest: „Allerdings sieht es dann [wenn du utf8_decode nicht nutzt] in der Webanwendung etwas seltsam aus“.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        Veranstaltungsdatenbank Vdb 0.3
        1. Hallo

          Wie gesagt, ich kann diese Zeichen hier nicht darstellen, weil das Forum einen Fehler anzeigt
          vielen Dank und viele Grüße
          hawk

  2. Om nah hoo pez nyeetz, hawkmaster!

    Wie kann man herausfinden welche Kodierung das ü hat?

    Frag doch mal, was es wirklich ist. http://rishida.net/uniview/

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Schal und Schallplatte.

    1. Om nah hoo pez nyeetz, Matthias Apsel!

      Wie kann man herausfinden welche Kodierung das ü hat?

      Frag doch mal, was es wirklich ist. http://rishida.net/uniview/

      In deinem Fall ist es

      0075  LATIN SMALL LETTER U
      0308  COMBINING DIAERESIS

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Nickel und Nickelodeon.

      1. Hallo

        0075  LATIN SMALL LETTER U
        0308  COMBINING DIAERESIS

        und was kann man jetzt damit anfangen mit :-)

        0308  COMBINING DIAERESIS ??

        Ich müsste ja in meinem PHP Code irgendwie auf solche Dinge reagieren können.
        vielen Dank und viele Grüße
        hawk

    2. Hallo

      Frag doch mal, was es wirklich ist. http://rishida.net/uniview/

      ich hoffe ich habs richtig gemacht:
      also das Problem ist ja das ü bei "für"

      in dem UNiview Test zeigt er das f, für das ü wird einmal:

      General category: Ll - Letter, lowercase
      Canonical combining class: 0 - Spacing, split, enclosing, reordrant, & Tibetan subjoined
      Bidirectional category: L - Left-to-right
      Uppercase mapping: 0055    U
      Titlecase mapping: 0055    U
      Unicode version: 1.1
      As text: u
      Decimal: 117
      HTML escape: &#x0075;
      URL escape: u

      und dann ein komisches Zeichen:

      General category: Mn - Mark, nonspacing
      Canonical combining class: 230 - Above
      Bidirectional category: NSM - Non-spacing mark
      Unicode 1.0 name: NON-SPACING DIAERESIS
      Unicode version: 1.1
      As text: ̈
      Decimal: 776
      HTML escape: &#x0308;
      URL escape: %CC%88

      Dann kommt das r.

      vielen Dank und viele Grüße
      hawk

  3. @@hawkmaster:

    nuqneH

    Wenn ich nun mit F2 den Dateinamen im Explorer kopiere und in Notepad++ oder Textpad kopiere sieht das ü plötzlich so aus:
    Eng_fu¨r_

    Normalisierung

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. Hello Gunnar,

      Normalisierung

      Hast Dz Zugriff auf die Seite?
      Dann solltest Du vielleicht mal "UFT-8" berichtigen. :-)

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bikers-lodge.com
      1. @@Tom:

        nuqneH

        Hast Dz Zugriff auf die Seite?
        Dann solltest Du vielleicht mal "UFT-8" berichtigen. :-)

        Nö. Ja. Hab’s weitergegeben. Danke.

        Qapla'

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    2. Hallo Gunnar,

      danke auch dir für die Hilfe.

      Wenn ich ehrlich bin kann ich mit diesem Normalisierungs Link nicht viel anfangen, bzw. keine Lösung für mein Problem finden.

      Man sagt doch zu solch einem Zeichen das aus zwei Zeichen besteht auch Digraph oder?

      ..Eng_fu¨r_

      Ich kann z.b. diese Datei auch nicht mit dem Notepad++ öffnen. Es kommt eine Fehlermdelung
      "The file does not exist. Do you want to create it?"

      Oder wenn ich das Windows CMD Fenster aufmache und einen "dir" eingebe, wird mir diese Datei auch mit u¨ angezeigt. Offensichtlich hat hier schon Windows Probleme?

      vielen Dank und viele Grüße
      hawk

      1. Hallo

        Wenn ich ehrlich bin kann ich mit diesem Normalisierungs Link nicht viel anfangen, bzw. keine Lösung für mein Problem finden.

        Doch, im allgemeinen weist der Artikel auf den richtigen Weg. Allerdings bietet er für dein konkretes Problem der Dateinamen keine Lösung.

        ..Eng_fu¨r_

        Ich kann z.b. diese Datei auch nicht mit dem Notepad++ öffnen. Es kommt eine Fehlermdelung

        Seit wann kann Notepad++ PDF-Dateien öffnen?

        "The file does not exist. Do you want to create it?"

        Oder wenn ich das Windows CMD Fenster aufmache und einen "dir" eingebe, wird mir diese Datei auch mit u¨ angezeigt. Offensichtlich hat hier schon Windows Probleme?

        Windows verwendet eine andere Kodierung für das ü. Dennoch sind beide Varianten erlaubt.

        Lies bitte, was dir Martin schrieb. Ich bin fest davon überzeugt, dass er am richtigen Faden zieht. Alles sieht danach aus, dass du bei der Verarbeitung und Speicherung des Uploads oder bei der Generierung der Ausgabe irgendwo eben nicht mit UTF-8 arbeitest.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        Veranstaltungsdatenbank Vdb 0.3
      2. Moin hawkmaster,

        Wenn ich ehrlich bin kann ich mit diesem Normalisierungs Link nicht viel anfangen, bzw. keine Lösung für mein Problem finden.

        Da du PHP zu nutzen scheinst, schau dir mal die Normalizer-Klasse an. Das Beispiel auf der verlinkten Seite zeigt schon, wie du aus der NFD-Form (die z.B. von OS X benutzt wird) die NFC-Form (die von Windows benutzt wird) machen kannst.

        LG,
         CK

  4. Hello,

    es wurde ja schon eine Menge geschrieben...
    Du hast aber leider keine vernünftige Beschreibung geliefert, ob es sich um den Dateinamen oder um den -Inhalt handelt.

    Und welche Fehlermeldung wurde produziert und von wem?

    Die Kodierung kenne ichvon "TROFF-Dateien". Die Werden bei Linux für MAN-Seiten benutzt.

    Wenn es um den Dateinamen geht, solltest Du den für das Dateisystem grundsätzlich selber vergeben. Da könnte man sich ja sonst einfach einen ausdenken ("../../etc/passwd").
    Den originalnamen kannst Du dann in einer Datenbank oder Datei übersetzen.

    Da nicht sichergestellt ist, in welcher Kodierung ein Zielsystem in seinem Dateisystem speichert, solltest Du den Namen aber auf jeden Fall immer normalisieren, also am besten auf ASCII zurückführen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
    1. Hallo Tom,

      auch dir danke für deine Hilfe.

      Wenn es um den Dateinamen geht, solltest Du den für das Dateisystem grundsätzlich selber vergeben.

      Ich habe eben Auge etwas ausführlicher geantwortet mit einem Bild wie die Umlaut ohen utf8_decode dargestellt werden. Ja, es geht mir nur um den Dateinamen. Nur ich kann den Dateinamen nicht verändern, weil ich die Datei später umkopieren möchte und für weitere Zwecke brauche.

      vielen Dank und viele Grüße
      hawk

  5. Moin Christian

    md5($dateiname);

    md5() ist aufgrund von bekannten und leicht auszurechnenden Kollisionen (ca. 40 Minuten mit aktueller Consumer-Hardware) prinzipiell nicht mehr zu verwenden.

    Um die Anzahl der durchgerechneten Strings auszudrücken reicht dann aber auch nicht mehr der Datentyp bigint.

    Hier geht es um vergleichsweise sehr wenige Dateinamen. Da wollen wir doch die Kirche im Dorf lassen.

    Jörg Reinholz