Axel: UTF-8 lässt mich nicht los

Hallo Leute,

ich wende mich nochmal hoffnungsvoll an Euch, mit einem Problem, was mich immer und immer wieder beschäftigt. UTF-8 und Dateinamen auf dem Webserver. Mal geht es, mal geht es nicht. Und ich weiß nicht so recht warum.

Also: Ich mache auf meinem Windows Rechner eine XSL-Transformation XML zu HTML. Dabei werden auch Javscript-Dateien erstellt. Diese Dateien können nun, bedingt durch die Transformation, z.B. Ü.js heissen. Später aber auch beliebige andere nicht deutsche Sonderzeichen. Diese sollen nun in die HTML-Seiten eingebunden werden, was auf meinem lokalen Apache unter Windows funktioniert.
Schicke ich die Dateien aber auf meinen Linux-Server im Netz, funktioniert das nicht, was aber meines Erachtens nicht direkt an Linux liegt.

Der manuelle Aufruf: http://www.blabla.xy/Ü.js klappt nicht.
Allerdings http://www.blabla.xy/%DC.js geht. Nun könnte ich mir überlegen alle Aufrufe einfach umzuwandeln. Jedoch ist %DC nicht Unicode und wird daher irgendwann nicht mehr alle Sonderzeichen unterstützen.

Ich weiß aber nicht, ob man in einer URL Unicode eingeben kann (z.B. %u00DC.js geht nicht :-)

Hat da jemand eine Idee, wie ich mich diesem Problem, bzw. der Lösung annähern kann? Auf welche Weise auch immer? (Außer auf die Dateinamen zu verzichten, das geht nicht)

Vielen, vielen Dank im Voraus
Schöne Grüße
Axel

  1. Axel,

    Hat da jemand eine Idee, wie ich mich diesem Problem, bzw. der Lösung annähern kann? Auf welche Weise auch immer?

    So, wie es Wikipedia auch tut: Du codierst Nicht-ACSII-Zeichen im URI in UTF-8.

    http://www.blabla.xy/Ü.js wied also nicht zu http://www.blabla.xy/%DC.js, sondern zu http://www.blabla.xy/%C3%BC.js.

    Du musst nur noch dem Server beibringen, das als UTF-8-codiert zu interprätieren.

    Live long and prosper,
    Gunnar

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    1. Hallo,

      vielen Dank für die Antwort,

      So, wie es Wikipedia auch tut: Du codierst Nicht-ACSII-Zeichen im URI in UTF-8.

      Ja, das scheint die Ideale Lösung zu sein (Daher macht es wohl Wikipedia auch). Nur das WIE.. ist die Frage. Wie sage ich meinem XSL-Transformator, dass die Dateinamen UTF Kodiert sein sollen. (Vor allem "encoded UTF-8", wie ich aus dem oberen Posts gelernt habe)

      Du musst nur noch dem Server beibringen, das als UTF-8-codiert zu interprätieren.

      Tja, die HTML-Seiten mit den JS-Dateien sollen auf jedem beliebigen Server, ohne meinen Zugriff, lauffähig sein. Wenn eine Änderung am Server unvermeidbar ist, kann ich die UTF-8 Kodierug leider gleich vergessen. Dann muss ich mir was ganz anderes überlegen.

      Vielen Dank nochmal.
      schöne Grüße
      Axel

  2. Hallo

    tja das mit den Umlauten und Sonderzeichen ist so ein Problem,
    aber wozu brauchst du Sie explizit, einfach durch nen Unterstrich in der Namensvergabe bzw. bei der Transformation ersetzen. Namensdopplungen sollten dann auch nur sehr selten sein.

    carue

    1. Hallo,

      vielen Dank für die Antwort.

      tja das mit den Umlauten und Sonderzeichen ist so ein Problem,
      aber wozu brauchst du Sie explizit, einfach durch nen Unterstrich in der Namensvergabe bzw. bei der Transformation ersetzen. Namensdopplungen sollten dann auch nur sehr selten sein.

      Es ist durchaus möglich, bzw. fast immer der Fall, dass Dateinamen entstehen, die nur aus einem Buchstaben bestehen. Aus Ä.js Ö.js und Ü.js würde nach der Methode immer _.js
      Somit wäre eine Namesdopplung sogar unvermeidbar, leider.

      Schöne Grüße
      Axel

  3. Hallo Axel,

    na bevor du als "ü.js" abspeicherst umkodieren, aber darauf bist du vermutlich schon selbst gekommen. kannst ja auch die "ü's" durch eigene Zeichenketten ersetzten, oder URL-encoden.

    Gruß, Frankx

    1. Hallo,

      vielen Dank für die Antwort.

      na bevor du als "ü.js" abspeicherst umkodieren, aber darauf bist du vermutlich schon selbst gekommen. kannst ja auch die "ü's" durch eigene Zeichenketten ersetzten, oder URL-encoden.

      Tja, die Idee an sich hatte ich schonmal. Das mit dem URL-encoden wird mir vermutlich wegen der Fülle möglicher Zeichen nicht ausreichen. Die Namen selbst in eine eigene "Kodierung" zu bringen wäre nur der aller letzte Strohalm, da ich mir ja theoretisch eine eigene Codetabelle für den gesamten Unicode Zeichensatz anlegen müsste.

      Schöne Grüße
      Axel

  4. Hallo,

    Also: Ich mache auf meinem Windows Rechner eine XSL-Transformation XML zu HTML. Dabei werden auch Javscript-Dateien erstellt. Diese Dateien können nun, bedingt durch die Transformation, z.B. Ü.js heissen. Später aber auch beliebige andere nicht deutsche Sonderzeichen. Diese sollen nun in die HTML-Seiten eingebunden werden, was auf meinem lokalen Apache unter Windows funktioniert.

    In einer URI mit http://localhost/Ü.js? Das darf so nicht funktionieren, weil Ü.js hier ein path_segment ist. Alle Zeichen, außer US-ASCII und sogar einige US-ASCII-Zeichen müssen darin escaped sein. Siehe: http://www.faqs.org/rfcs/rfc2396.html. Wenn das also zufällig funktioniert, dann funktioniert das zufällig.

    Schicke ich die Dateien aber auf meinen Linux-Server im Netz, funktioniert das nicht, was aber meines Erachtens nicht direkt an Linux liegt.

    Welches Linux?

    Der manuelle Aufruf: http://www.blabla.xy/Ü.js klappt nicht.
    Allerdings http://www.blabla.xy/%DC.js geht.

    Ja, dann sind die Dateinamen in einem ISO- bzw. Latin-Zeichensatz angelegt.

    Nun könnte ich mir überlegen alle Aufrufe einfach umzuwandeln. Jedoch ist %DC nicht Unicode und wird daher irgendwann nicht mehr alle Sonderzeichen unterstützen.

    Sendest Du denn die Dateinamen im UTF-8 encoding? Wie und womit überträgst Du die Dateien?

    Ich weiß aber nicht, ob man in einer URL Unicode eingeben kann (z.B. %u00DC.js geht nicht :-)

    Unicode direkt nicht, aber encoded UTF-8:
    http://www.blabla.xy/%C3%9C.js

    viele Grüße

    Axel

    1. Hallo,

      vielen Dank erstmal für die Antwort...

      Alle Zeichen, außer US-ASCII und sogar einige US-ASCII-Zeichen müssen darin escaped sein. Siehe: http://www.faqs.org/rfcs/rfc2396.html. Wenn das also zufällig funktioniert, dann funktioniert das zufällig.

      Ok, dass ist schonmal ein Schritt. Ich kann mir also sicher sein, dass ich nicht Ü.js aufrufen darf.

      Welches Linux?

      Weiß ich gerade nicht genau. Das ist ein Server (Besser gesag Webspace) bei 1&1. Für meine Zwecke muss das aber eigentlich sowieso auf allen Systemen laufen.

      Allerdings http://www.blabla.xy/%DC.js geht.
      Ja, dann sind die Dateinamen in einem ISO- bzw. Latin-Zeichensatz angelegt.

      Aha. Meine Dateinamen sind also NICHT im UTF-8 Format. So kann es nicht bleiben, den die Zweistelligen Hex-Codes werden nicht alle Zeichen abbilden können, die ich irgendwann vielleicht brauche.

      Sendest Du denn die Dateinamen im UTF-8 encoding? Wie und womit überträgst Du die Dateien?

      Mmh. Mit den FTP-Befehlen von PHP :-) Im UTF-8 Encoding senden? Ich denke nicht. Werde ich mal recherchieren.

      Unicode direkt nicht, aber encoded UTF-8:
      http://www.blabla.xy/%C3%9C.js

      Hmpf. Mist. Irgendwas in meinem XML-PHP-JAVA-JS-Windows-Linux Gefüge scheint die Idee auch gehabt zu haben. Die Anfragen an den Server werden sogar so ausgeführt. Also wenn ich mir den Javascript-Generierten Quelltext anschaue, sind die Anfragen so im Code. Aber der Aufruf funktioniert nicht.
      -> Was hab ich gelernt.. Die Dateinamen liegen nicht UTF-Codiert im System. DAS muss ich ändern und dann müsste es gehen !?!?

      Da bin ich mal gespannt.
      Vielen Dank nochmal bis hier
      Schöne Grüße
      Axel

      1. Hallo,

        Welches Linux?
        Weiß ich gerade nicht genau. Das ist ein Server (Besser gesag Webspace) bei 1&1. Für meine Zwecke muss das aber eigentlich sowieso auf allen Systemen laufen.

        Oha! Dann vergiss es, noch ;-). Der Web-Server verlässt sich bei einer Ressourcen-Anforderung auf das Dateisystem des Servers. Lange nicht alle Dateisysteme legen ihre Verzeichnisse schon in Unicode an. Selbst wenn, kann das dann auch noch UCS (jedes Zeichen ist 16 Bit lang) _oder_ UTF-8 (nur nicht ASCII-Zeichen sind länger als 8 Bit) sein. Andere Möglichkeiten gäbe es auch noch, aber seltener.

        -> Was hab ich gelernt.. Die Dateinamen liegen nicht UTF-Codiert im System. DAS muss ich ändern und dann müsste es gehen !?!?

        Ja. Du sagtest aber auch schon, dass Du genau das nicht können wirst, weil: "muss das aber eigentlich sowieso auf allen Systemen laufen".

        viele Grüße

        Axel

        1. Hallo,

          Oha! Dann vergiss es, noch ;-). Der Web-Server verlässt sich bei einer Ressourcen-Anforderung auf das Dateisystem des Servers. Lange nicht alle Dateisysteme legen ihre Verzeichnisse schon in Unicode an. Selbst wenn, kann das dann auch noch UCS (jedes Zeichen ist 16 Bit lang) _oder_ UTF-8 (nur nicht ASCII-Zeichen sind länger als 8 Bit) sein. Andere Möglichkeiten gäbe es auch noch, aber seltener.

          -> Was hab ich gelernt.. Die Dateinamen liegen nicht UTF-Codiert im System. DAS muss ich ändern und dann müsste es gehen !?!?
          Ja. Du sagtest aber auch schon, dass Du genau das nicht können wirst, weil: "muss das aber eigentlich sowieso auf allen Systemen laufen".

          Hmm. Ich habe ja in einer Antwort weiter oben geschrieben, dass es jeztt funktioniert. Nach der Antwort würde das bedeuten, dass das schon wieder nur Zufall ist. Also könnte (wird) es so sein, dass das immer nur auf einige Server so funktioniert und auf anderen nicht (anders) ?!?

          Oh Gott. Was mach ich den jetzt? :-) Wenn ich für alle erdenklichen Möglichkeiten eine Lösung finde, kann ich das ja auswählbar machen. Upload in UTF-8, NICHT in UTF-8, in UCS (noch nie gehört) usw.
          Na, das wird die Benutzer sicher wieder überfordern (und mich auch *g*).
          Dann muss ich vielleicht doch selber eine eigene "Codetabelle" nehmen.
          Evtl. könnte ich die Dateinamen intern in UTF-8 umwandeln und dann per String-Ersetzung die Prozentzeichen entfernen. So weiß ich dann (und kann meine Software beibringen), dass C39C für Ü steht.

          Oh mann. Diese Unicode - Geschichten fand ich ja schon immer kompliziert, aber das ist schlimmer als ich dachte.

          Vielen Dank für Deine Hilfe
          Schöne Grüße
          Axel

          1. Hallo,

            Hmm. Ich habe ja in einer Antwort weiter oben geschrieben, dass es jeztt funktioniert. Nach der Antwort würde das bedeuten, dass das schon wieder nur Zufall ist. Also könnte (wird) es so sein, dass das immer nur auf einige Server so funktioniert und auf anderen nicht (anders) ?!?

            Naja, so schlecht ist Deine Lösung nicht, wenn der Upload immer mit PHP erfolgt und die Dateien nie mit einem beliebigen FTP-Client oder direkt mit einem Dateibrowser des Serversystems (z.B. via ssl) kopiert bzw. geöffnet werden müssen. Dein PHP legt eben als Dateinamen z.B. die Bytes "\xC3\x9C\x62\x75\x6E\x67" ab. Einige Dateisysteme sehen das als "Übung", andere als "Ãœbung", andere noch anders, aber an den Bytes sollte sich nichts ändern.

            Das einzige, was passieren kann, ist, dass das System dem PHP sagt: "Ne, so nen Namen nehm ich nich!"

            Oh mann. Diese Unicode - Geschichten fand ich ja schon immer kompliziert, aber das ist schlimmer als ich dachte.

            Siehe Tims Posting. Wenn Leute, die sich beim W3C mit Internationalisierung beschäftigen, hierzu eigens Apache-Module schreiben, wird es so einfach nicht sein ;-).

            viele Grüße

            Axel

            1. Hallo,

              vielen Dank nochmal. Das klingt ja wieder etwas beruhigend. Ich werde das einfach beobachten müssen und abwarten, was dann passiert. Solang das funktioniert, ist alles in Ordnung. Ansonsten muss ich mir halt was anderes überlegen.

              Schöne Grüße
              Axel

  5. Hallo Axel,

    UTF-8 und Dateinamen auf dem Webserver.

    Das Problem liegt darin, dass Dateinamen auf dem Webserver nicht zwangsläufig in UTF-8 kodiert sind. Der Webserver empfängt ein paar Bytes (Oktetts) und versucht diese auf einen konkreten Pfad umzuwandeln. Um Erfolg zu haben, muss die Datei in denselben Oktetts kodiert sein wie in der URI, also UTF-8.

    Martin Dürst, tätig in der Entwicklung von IRIs bei W3C hat dazu mal einen Präsentation gegeben, die Folien dazu sind recht interessant. Außerdem hat er ein Apache Modul namens mod_fileiri in der Entwicklung, dass zwischen UTF-8-Oktetts in {U|I}RIs und einer Legacy-Kodierung im Dateisystem mappen kann. Eventuell hilft Dir das.

    Tim

    1. Hallo,

      vielen Dank für die Antwort.

      Um Erfolg zu haben, muss die Datei in denselben Oktetts kodiert sein wie in der URI, also UTF-8.

      Ok, Dateinamen müssten UTF-8 Kodiert sein. ABER...

      Martin Dürst, tätig in der Entwicklung von IRIs bei W3C hat dazu mal einen Präsentation gegeben, die Folien dazu sind recht interessant.

      ...Den Folien entnehme ich, dass man den Browser das in den Einstellungen sagen muss, dass der URLs per UTF-8 schicken soll. Stimmt das? Dann kann ich auch UTF-8 aufgeben. Denn das kann ich den Nutzern nicht zumuten.

      Außerdem hat er ein Apache Modul namens mod_fileiri in der Entwicklung, dass zwischen UTF-8-Oktetts in {U|I}RIs und einer Legacy-Kodierung im Dateisystem mappen kann. Eventuell hilft Dir das.

      Ein Apache-Modul kommt leider auch nicht in Frage. Die HTML-Seiten sollen auf einem beliebigen Server (Auch Webspace) lauffähig sein. Also auch auf welchen, an denen ich keine Änderungen vornehmen kann.

      Vielen Dank nochmal
      Schöne Grüße
      Axel

  6. HALLOOOOO nochmal,

    vielen, vielen Dank Euch allen nochmal. Die Tips haben mich zur Lösung gebracht. Habe aus reiner Verzweiflung etwas probiert, von dem ich nie gedacht hätte, das es geht.
    Die Dateinamen UTF-Kodiert.
    Für diejenigen, die PHP kennen:

    Beim Upload der Dateien auf meinen Linux Server habe ich folgenden Befehl:
    ftp_put($conn, $file, $dir.$file, FTP_BINARY);

    ersetzt durch:
    ftp_put($conn, utf8_encode($file), $dir.$file, FTP_BINARY);

    Und jetzt scheine ich tatsächlich die Dateinamen damit kodiert zu haben. Jedenfalls funktioniert es.

    Yipeeh.

    Schöne Grüße
    Axel

    1. Hallo,

      ftp_put($conn, utf8_encode($file), $dir.$file, FTP_BINARY);
      Und jetzt scheine ich tatsächlich die Dateinamen damit kodiert zu haben. Jedenfalls funktioniert es.

      Ja, Du hast den String $file UTF-8 kodiert und Dein aktuelles Serversystem lässt PHPs ftp_put einen Dateinamen wie "Ãœbung" anlegen. Ob das wirklich alle Systeme mit sich machen lassen?

      Du kannst das nur ausgiebig testen. Verlassen würde ich mich darauf nicht.

      viele Grüße

      Axel