bert: Umlaute als "ü" welche Formatierung?

Hi,

ich habe ein Datei-Upload-Script auf Ajax-Basis. Wenn man Dateien mit Umlauten hochläd, werden diese Umlaute umgewandelt in ein merkwürdiges Format. Aus einem ü wird bspw. ü

Welche Codierung ist das und wie kann ich die Umlaute dann ersetzen (zB durch ue)?

Ich arbeite standardmäßig auf UTF-8-Basis.

Die php, die nach Upload aufgerufen wird hat folgenden Inhalt:

$mail = preg_replace(Array("/\./","/@/"), Array("__","_-_"), $_GET['mail']);  
  
$uploaddir = $_SERVER['DOCUMENT_ROOT'].'/uploads/'.$mail.'--';  
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);  
  
  
$_maxmb = 2;  
  
if ($_FILES['userfile']['size'] > $_maxmb*1024*1024) {  
	echo 'oversize';  
}  
else {  
	//move_uploaded_file ist die Standard PHP-Funktion um Dateien auf dem Server zu verarbeiten  
	if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {  
		echo $mail;  
	} else {  
	  // Als echo keinesfalls false benutzen. Führt zu Konflikten mit dem Ajax-Request  
		echo 'error';  
	}  
}

Nehme mal an, dass ich bei move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile) ein preg_replace einbauen muss. Aber nach welchen Zeichen muss ich suchen, um üöäÜÖÄß zu ersetzen? Kenne denZeichensatz nicht, der hier für die Ersetzung von Umlauten verwendet wird..

Danke für eure Hilfe

  1. ich habe ein Datei-Upload-Script auf Ajax-Basis. Wenn man Dateien mit Umlauten hochläd, werden diese Umlaute umgewandelt in ein merkwürdiges Format. Aus einem ü wird bspw. ü

    In UTF-8 hat ein ü die Bytefolge C3 BC, in ISO-8859-1 hat ein ü die Bytefolge FC

    In ISO-8859-1 oder auch Windows-1252 hat ein à die Bytefolge C3 und ¼ die Bytefolge BC.

    Welche Codierung ist das und wie kann ich die Umlaute dann ersetzen (zB durch ue)?

    Warum willst du die die Umlaute erstetzen?

    Ich arbeite standardmäßig auf UTF-8-Basis.

    Tust du scheinbar nicht :) Du hast eine Bytefolge die offenbar UTF-8 ist, du gibst sie aber in irgend einer 8-Bit-ANSI-Codierung aus.

    Nehme mal an, dass ich bei move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile) ein preg_replace einbauen muss.

    Nein, du musst nur überall UTF-8 verwenden.

    1. Hi!

      Ich arbeite standardmäßig auf UTF-8-Basis.
      Tust du scheinbar nicht :) Du hast eine Bytefolge die offenbar UTF-8 ist, du gibst sie aber in irgend einer 8-Bit-ANSI-Codierung aus.

      Oder aber es wurde irgendwann mal doppelt von ISO-8859-1/Latin1 nach UTF-8 umkodiert.

      Lo!

    2. Ich arbeite standardmäßig auf UTF-8-Basis.

      Tust du scheinbar nicht :) Du hast eine Bytefolge die offenbar UTF-8 ist, du gibst sie aber in irgend einer 8-Bit-ANSI-Codierung aus.

      Alle Dateien sind im Format UTF-8 ohne BOM gespeichert und auch sonst habe ich eigentlich keine Probleme mit der Formatierung.

      Wenn ich den Fehler nicht finde - und es mich nicht stört, wenn einfach alle Dateinamen umbenannt werden - wie bekomme ich dann für die Sonderzeichen die entsprechende Codierung heraus?

      1. Alle Dateien sind im Format UTF-8 ohne BOM gespeichert und auch sonst habe ich eigentlich keine Probleme mit der Formatierung.

        Ich glaube nicht, dass du "eigentlich keine Probleme" hast, denn du hast offensichtlich ein Problem mit der Zeichenkodierung.

        Wenn ich den Fehler nicht finde - und es mich nicht stört, wenn einfach alle Dateinamen umbenannt werden - wie bekomme ich dann für die Sonderzeichen die entsprechende Codierung heraus?

        Ich sagte dir bereits, dass die Daten in einer UTF-8-Codierung gespeichert wurden, das ist offensichtlich, da gibts nichts herrauszubekommen.

        Du (und nur du) interpretierst sie aber als ISO-8891-1 oder einer vergleichbaren Codierung.

        1. Du (und nur du) interpretierst sie aber als ISO-8891-1 oder einer vergleichbaren Codierung.

          Kann das daran liegen, dass die php Datei, die die Upload-Datei in den uploads-Ordner verschiebt, über ajax aufgerufen wird und keinen Metatag

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

          besitzt?

          Die Datei darf nämlich keine Ausgabe aus der vorhandenen besitzen.

          Die Datei selbst ist ebenfalls als utf8 gespeichert. Wie kann ich denn herausfinden, wo genau ich mit dem falschen Charset arbeite?

          1. Kann das daran liegen, dass die php Datei, die die Upload-Datei in den uploads-Ordner verschiebt, über ajax aufgerufen wird und keinen Metatag

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

            besitzt?

            Nein, ein Meta-Element spielt bei der HTTP-Kommunikation in der Praxis eine untergeordnete Rolle. Ein PHP-Script interessiert sich sowieso nicht dafür.

            Die Datei selbst ist ebenfalls als utf8 gespeichert. Wie kann ich denn herausfinden, wo genau ich mit dem falschen Charset arbeite?

            Indem du alles Stück für Stück prüfst.

            Ist die Datei bzw. das Script in UTF-8 gespeichert? Spricht eine allfällig vorhandene Datenbank mit dem Script (bzw umgekehrt) in UTF-8? Wird Ressource per HTTP als UTF-8 übertragen?

            1. Ist die Datei bzw. das Script in UTF-8 gespeichert?

              Ja

              Spricht eine allfällig vorhandene Datenbank mit dem Script (bzw umgekehrt) in UTF-8?

              Nein. Und wenn, dann wäre es in UTF8.

              Wird Ressource per HTTP als UTF-8 übertragen?

              ?? Das sagt mir nichts. Wie prüfe ich das?

              Danke und Gruß

              1. Wird Ressource per HTTP als UTF-8 übertragen?

                ?? Das sagt mir nichts. Wie prüfe ich das?

                Welchen Browser verwendest du?

                1. Welchen Browser verwendest du?

                  Firefox. Kann aber auch über IE8, Chrome und Opera, falls das hilft..

                  1. Firefox. Kann aber auch über IE8, Chrome und Opera, falls das hilft..

                    Extras -> Seiteninformationen.

                    Kodierung:

                    1. Kodierung:

                      UTF-8

                      1. Kodierung:

                        UTF-8

                        Kannst du nochmal genau beschreiben wo in welchen Zustand was eine fehlerhafte Codierung aufweist?

                        1. Moin!

                          Kodierung:

                          UTF-8

                          Kannst du nochmal genau beschreiben wo in welchen Zustand was eine fehlerhafte Codierung aufweist?

                          Ich wundere mich grundsätzlich, wie man mit Ajax Dateien hochladen will. Sowas funktioniert nach meinem Kenntnisstand nämlich nicht und wird vermutlich ersetzt durch eine Aktion, die in einem versteckten IFrame ganz klassisch das Formular abschickt.

                          Insofern wirkt hier also kein Ajax mit UTF-8-Daten, sondern ein geheimes Formular mit einem normalen POST-Request und unbekannter Codierung. Kann UTF-8 sein, muss aber nicht.

                          Die Firebug-Extension zeigt im Network-Tab aber in jedem Fall sämtliche Kommunikation inklusive aller HTTP-Header an und sollte als primäre Anlaufstelle herangezogen werden, um zu checken, was da alles über die Leitung geht.

                          Ohne Firebug kann man sowieso nicht vernünftig entwickeln. :)

                          - Sven Rautenberg

                          1. Ich wundere mich grundsätzlich, wie man mit Ajax Dateien hochladen will.

                            Diese Frage hätte man natürlich stellen können - warum wir das bisher unterlassen haben, ist mir ein Rätsel.

                            Ich ging bisher davon aus, dass einfach beliebiger Klartext per JavaScript an den Server gepostet wird der dann mit diesen Daten ein File erzeugt :)

                            Ohne Firebug kann man sowieso nicht vernünftig entwickeln. :)

                            Ich komm mit Dragonfly ganz gut zurecht :)

                            1. Ich wundere mich grundsätzlich, wie man mit Ajax Dateien hochladen will.

                              Diese Frage hätte man natürlich stellen können - warum wir das bisher unterlassen haben, ist mir ein Rätsel.

                              Habe mir ein Script dafür runtergeladen:

                              * AJAX Upload ( http://valums.com/ajax-upload/ )
                               * Copyright (c) Andris Valums
                               * Licensed under the MIT license ( http://valums.com/mit-license/ )

                              Habe daran eigentlich kaum was geändert. Halt alle Dateien in UTF-8 ohne BOM konvertiert..

                              Dateien mit Umlauten werden aber mit kryptischen Symbolen auf meinem Server abgelegt. Die Ausgabe für den User (welche Dateien er hochgeladen hat) zeigt die Umlaute aber ganz normal an. Muss also imho an der augerufenen php liegen, die die Datei in den uploads-Ordner schiebt (beim ersten post hab ich dir gequotet).

                              Danke für eure Hilfe

                              1. Hallo

                                Dateien mit Umlauten werden aber mit kryptischen Symbolen auf meinem Server abgelegt. Die Ausgabe für den User (welche Dateien er hochgeladen hat) zeigt die Umlaute aber ganz normal an. Muss also imho an der augerufenen php liegen, die die Datei in den uploads-Ordner schiebt (beim ersten post hab ich dir gequotet).

                                Was da, wenn es am PHP-Skript liegt, schief gehen könnte (und auch oft tut), habe ich bereits vor drei Tagen geschrieben. Bitte beachte Svens Anmerkungen bezüglich der Prüfung, ob die benötigte Funktion zur Verfügung steht.

                                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!"
                                Veranstaltungsdatenbank Vdb 0.3
                              2. Moin!

                                Ich wundere mich grundsätzlich, wie man mit Ajax Dateien hochladen will.

                                Diese Frage hätte man natürlich stellen können - warum wir das bisher unterlassen haben, ist mir ein Rätsel.

                                Habe mir ein Script dafür runtergeladen:

                                Das macht aber kein echtes Ajax. Wie auf der Seite auch steht:

                                * AJAX Upload ( http://valums.com/ajax-upload/ )

                                "How it works?

                                Plugin creates invisible file input on top of the button you provide, so when user clicks on your button the normal file selection window is shown. And after user selects a file, plugin submits form that contains file input to an iframe. So it isn’t true ajax upload, but brings same user experience."

                                Habe daran eigentlich kaum was geändert. Halt alle Dateien in UTF-8 ohne BOM konvertiert..
                                Dateien mit Umlauten werden aber mit kryptischen Symbolen auf meinem Server abgelegt. Die Ausgabe für den User (welche Dateien er hochgeladen hat) zeigt die Umlaute aber ganz normal an. Muss also imho an der augerufenen php liegen, die die Datei in den uploads-Ordner schiebt (beim ersten post hab ich dir gequotet).

                                Nein, das ist eine Sache des Dateisystems des Webservers. Das Dateisystem muss nicht zwingend UTF-8 als Dateinamen verstehen. Aber solange es nur Bytes akzeptiert und wieder zurückgibt, ohne sie zu verändern, kannst du webseitig ohne Probleme die Umlaute in den Namen drinhaben.

                                Andererseits sind Umlaute in Dateinamen immer wieder eine Quelle von Ärgernis und sollten deshalb vermieden werden - und wenn der User zu blöd ist, die Dateien korrekt zu benennen, wäre das die Aufgabe deines Skripts.

                                - Sven Rautenberg

      2. Hallo

        Ich arbeite standardmäßig auf UTF-8-Basis.

        Tust du scheinbar nicht :) Du hast eine Bytefolge die offenbar UTF-8 ist, du gibst sie aber in irgend einer 8-Bit-ANSI-Codierung aus.

        Alle Dateien sind im Format UTF-8 ohne BOM gespeichert

        Das ist beim verkrüppelten Zeichen zu sehen. Allerdings gehört nicht nur das Speichern an sich zur Verarbeitung, sondern auch die vorhergehende Verarbeitung.

        Wie du schreibst, hast du ein Uploadformular, das seine Daten per Ajax an den Server sendet. Ajax ist JavaScript und das verwendet UTF-8 als Standardkodierung. Soweit, so gut. Auf dem Server nimmt ein PHP-Skript die Daten entgegen, verarbeitet sie und sorgt für die Speicherung der Datei.

        *Hier* solltest du prüfen, ob die Verarbeitung (speziell des Strings des Dateinamens) ebenfalls mit UTF-8 geschieht. Wenn auf deinem Server/Webspace die mb-Funktionen von PHP aktiviert sind, kannst du mit mb_internal_encoding die *bei der Verarbeitung des Skripts* benutze Kodierung lesen bzw. explizit angeben.

        Achtung: Prüfe auf die Konstante 'MB_CASE_LOWER', um herauszufinden, ob die mb-Funktionen da sind (sie gehören nicht zur Standardinstallation). Ist sie nicht angelegt, sind die mb-Funktionen nicht in der PHP-Installation enthalten.

        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!"
        Veranstaltungsdatenbank Vdb 0.3
        1. Moin!

          Achtung: Prüfe auf die Konstante 'MB_CASE_LOWER', um herauszufinden, ob die mb-Funktionen da sind (sie gehören nicht zur Standardinstallation). Ist sie nicht angelegt, sind die mb-Funktionen nicht in der PHP-Installation enthalten.

          Das ist eine ziemliche Krücke. Es gibt function_exists() sowie extension_loaded() zum Prüfen, ob ein optionaler Bestandteil von PHP tatsächlich zur Verfügung steht.

          Eine Konstante muss ja nicht zwingend von der Extension angelegt worden sein. Wenn die Konstante existiert, kann die Extension trotzdem fehlen.

          - Sven Rautenberg

  2. Ich arbeite standardmäßig auf UTF-8-Basis.

    Das gilt nicht für das Überprüfen des Uploads. Du hast die Daten hochgeladen und sie sind auf dem Server. Und nun möchtest du die überprüfen. Das bedeutet: Du siehst dir die Daten auf eine bestimmte Art und weise im Editor an. Und hier geht der Browser davon aus, dass es sich um eine iso-codidierung handelt. Die Daten sind in der Tat utf-8 gespeichert.