Flownie: Umwandlung polnischer Text für CSV

Hallo

Ich habe teilweise polnischen Text in einer Datenbank. Dort ist er z.B. wie folgt gespeichert: Świca

Bei der HTML Ausgabe ist dies natürlich kein Problem, da der Browser das Ś korrekt darstellt.

Nun möchte ich das ganze von der Datenbank in ein CSV exportieren. Dort wird dann aber natürlich dies nicht korrekt interpretiert und das ; noch als Spaltentrenner angesehen.

Kann ich mit einer PHP Funktion das Ś für CSV korrekt umwandeln?

Danke
Marc

  1. Hallo!

    Kann ich mit einer PHP Funktion das Ś für CSV korrekt umwandeln?

    Ich bin mir jetzt nicht sicher aber vielleicht hilft dir das weiter.

    mfg
      frafu

  2. Hallo Marc,

    Nun möchte ich das ganze von der Datenbank in ein CSV exportieren. Dort wird dann aber natürlich dies nicht korrekt interpretiert und das ; noch als Spaltentrenner angesehen.

    CSV kennt mehrere Möglichkeiten der Aufbereitung für die Daten.
    Wenn Du die CSV-Datei mit einem Programm eiliest, dass auch wirklich CSV lesen kann, dann kannst Du:

    jedes Feld in Begrenzer einpacken, also z.B. Doppelhäkchen
    Dadurch können in den Datenfeldern selber die Feldtrennzeichen sowie Datensatzbegrenzer (Zeilenende-Zeichen) enthalten sein.

    Das Doppelhäkchen selber wird escaped, indem man es verdoppelt.

    "Feldinhalt";"Zweites Feld mit ; und , ...";"Feld 3";4444;"fünftes Feld
    enthält einen Text, der Häkchen ("") enthält und außedem
    auch Zeilenumbrüche"

    So verpackt darfst Du alle Zeichen in den Daten nutzen. Echte numerische Felder werden im Allgemeinen nicht quoted, dürfen es aber. Dann ist nur keine automatische Typunterscheidung mehr möglich zwischen String und Numeric

    LG
    Chris©

    1. Hallo Chris

      So verpackt darfst Du alle Zeichen in den Daten nutzen. Echte numerische Felder werden im Allgemeinen nicht quoted, dürfen es aber. Dann ist nur keine automatische Typunterscheidung mehr möglich zwischen String und Numeric

      Super, vielen Dank für den Hinweis. Das löst mir erst mal das Problem mit den unbeabsichtigten Spaltenumbrüchen.

      Ich habe auch den Hinweis von FraFu benutzt. Wenn ich nun den Eintrag nur so im Browser ausgeben lasse, wird das Sonderzeichen korrekt dargestellt:

      html_entity_decode($PersonFirstname, ENT_COMPAT, "UTF-8")

      Musste dazu noch den Header auf UTF-8 stellen. Wenn man sich das nun im Browser anzeigen lässt und den Quelltext ansieht, steht es da genau wie es sein muss.

      Ins CSV schreibt er aber leider einen ungültigen Wert: Åš

      Wie kann ich das richtige Zeichen Ś ausgeben?

      1. Hallo!

        Musste dazu noch den Header auf UTF-8 stellen. Wenn man sich das nun im Browser anzeigen lässt und den Quelltext ansieht, steht es da genau wie es sein muss.

        Ins CSV schreibt er aber leider einen ungültigen Wert: Åš

        Ich bezweifle, dass ein falscher Wert drinnen steht. Es ist eher eine Frage der Interpretation. Mit welchem Tool machst du das CSV File auf? Diesem Tool musst du auch noch sagen, dass es sich um UTF-8 handelt.

        mfg
          frafu

        1. Hallo frafu

          Ich bezweifle, dass ein falscher Wert drinnen steht. Es ist eher eine Frage der Interpretation. Mit welchem Tool machst du das CSV File auf? Diesem Tool musst du auch noch sagen, dass es sich um UTF-8 handelt.

          Ist egal, mit welchem Tool ich es öffne (Editor, Wordpad oder Excel). Es steht immer derselbe (falsche) Wert drin. Irgendwie müsste ich doch PHP mitteilen können, dass er die Datei im UTF-8 Format abspeichern soll.

          Aber ich finde keinen enstprechenden Befehl.

          1. Hallo!

            Ist egal, mit welchem Tool ich es öffne (Editor, Wordpad oder Excel). Es steht immer derselbe (falsche) Wert drin. Irgendwie müsste ich doch PHP mitteilen können, dass er die Datei im UTF-8 Format abspeichern soll.

            Weiß dieser Editor (Wordpad, Excel) auch dass es sich um UTF-8 handelt? Das Zeichen das du hier gepostet hast, deutet nämlich schon darauf hin, dass es UTF-8 ist. Im File selbst ist nämlich keinerlei Information darüber um welchen Characterset es sich handelt.

            mfg
              frafu

            1. Weiß dieser Editor (Wordpad, Excel) auch dass es sich um UTF-8 handelt? Das Zeichen das du hier gepostet hast, deutet nämlich schon darauf hin, dass es UTF-8 ist. Im File selbst ist nämlich keinerlei Information darüber um welchen Characterset es sich handelt.

              Nein, es ist ja nirgends die Info gespeichert, dass es UTF-8 ist. Das ist ja das Problem. Das müsste ich beim PHP File irgendwo mitgebeben.

              Egal was ich probiere, ich kriegs nicht hin. Das müsste doch irgendwer schon mal gelöst haben?

              1. Hallo!

                Nein, es ist ja nirgends die Info gespeichert, dass es UTF-8 ist. Das ist ja das Problem. Das müsste ich beim PHP File irgendwo mitgebeben.

                Du hast doch schon erwähnt, dass die Ausgabe des CSV Files mit UTF-8 funktioniert?
                In PHP gibst du im Header mit um welches Characterset es sich handelt.
                Das machst du wahrscheinlich mit
                Header("Content-Type: text/csv; charset=UTF-8")
                Damit bekommt es der Browser mit um welches charset es sich handelt und kann die Daten dementsprechend interpretieren.

                Jetzt speicherst du das File auf der Platte und damit ist die Information um welchen Charset es sich handelt aber unwiederruflich dahin. Diese Info wird nicht im File abgespeichert.
                Wenn du jetzt das File von der Platte mit Excel aufmachst, weiß Excel nicht um welchen Charset es sich handelt. Es nimmt das Standardcharset das nicht unbedingt UTF-8 sein muss. Wenn Excel jetzt die Daten falsch interpretiert, dann musst du dafür in den Excel Einstellungen sorgen, dass es die Daten als UTF-8 interpretiert.

                mfg
                  frafu

                1. Hallo

                  Jetzt speicherst du das File auf der Platte und damit ist die Information um welchen Charset es sich handelt aber unwiederruflich dahin. Diese Info wird nicht im File abgespeichert.
                  Wenn du jetzt das File von der Platte mit Excel aufmachst, weiß Excel nicht um welchen Charset es sich handelt. Es nimmt das Standardcharset das nicht unbedingt UTF-8 sein muss. Wenn Excel jetzt die Daten falsch interpretiert, dann musst du dafür in den Excel Einstellungen sorgen, dass es die Daten als UTF-8 interpretiert.

                  Ja genau das ist das Problem. Das habe ich nun gelöst. Statt das File einfach direkt mit Excel aufzumachen, kann man Excel öffnen, dann -> Daten -> Aus Text -> usw.

                  Dort kann man die Daten quasi aus dem CSV importieren. Während dieses Vorganges kann man auch die Kodierung wählen -> UTF-8 auswählen und siehe da, es klappt. Die Zeichen werden korrekt importiert und dargestellt.

                  Ich glaube auch, ich kann diese Lösung dem Kunden auch zumuten. Schön wäre es gewesen, wenn man in PHP die Info über das Charset dem CSV hätte mitgeben können, irgendwo im Dateikopf. Dies scheint ja aber nicht zu funktionieren...

                  Danke für Eure Hilfe...

                  1. Hallo!

                    Ich glaube auch, ich kann diese Lösung dem Kunden auch zumuten. Schön wäre es gewesen, wenn man in PHP die Info über das Charset dem CSV hätte mitgeben können, irgendwo im Dateikopf. Dies scheint ja aber nicht zu funktionieren...

                    Was stellst du dir unter einem "Dateikopf" vor?
                    Es gibt zb bei HTML oder XML die Möglichkeit über Meta Daten in der Datei den Characterset zu setzen.
                    zb mit:
                    <meta http-equiv="content-type" content="text/html; charset=UTF-8">

                    Damit ist ein Programm, dass diese Datei öffnet angewiesen den Inhalt als UTF-8 zu interpretieren.

                    CSV ist ein Trivialdateiformat das nichtmal richtig standardisiert ist. Metadaten wie bei XML oder HTML kennt das Format nicht.

                    mfg
                      frafu

                    1. Es gibt zb bei HTML oder XML die Möglichkeit über Meta Daten in der Datei den Characterset zu setzen.
                      zb mit:
                      <meta http-equiv="content-type" content="text/html; charset=UTF-8">

                      Nein, das reicht nicht, siehe hier:
                      https://forum.selfhtml.org/?t=168414&m=1098798

                      MfG Kalle

                      1. Hallo!

                        Es gibt zb bei HTML oder XML die Möglichkeit über Meta Daten in der Datei den Characterset zu setzen.
                        zb mit:
                        <meta http-equiv="content-type" content="text/html; charset=UTF-8">

                        Nein, das reicht nicht, siehe hier:
                        https://forum.selfhtml.org/?t=168414&m=1098798

                        Ich hab von offline Files gesprochen. Dh. Files direkt von der Festplatte öffnen ohne dass irgendwo ein Server im Spiel ist. Dafür brauchst du Meta Angaben im File. Und für CSV Files ist soetwas eben nicht vorgesehen.

                        mfg
                          frafu

                  2. Hallo,

                    vielleicht gibt es noch eine andere Lösung.

                    Wie kommt denn das File zum Excel?
                    Du könntest alternativ auch eine vorgefertigte Excel-Lösung bauen, die sich die Daten per Webabfrage direkt vom Webserver holt. Das klappt ganz gut. Da kann man dann auch festlegen, dass Excel die Daten in UTF-8 bekommt.

                    Man muss dann aber leider für die Daten wieder ein anderes Format erzeugen, das die Datenfelder (Spalten) durch Tabulatoren voneinander trennt. Sonst kann Excel den Import aus dem Web auch wieder nicht durchführen.

                    Wenn man nun so ein Excel-File öffnet, holt sich Excel automatisch die zugehörigen Daten vom Webserver, Internetverbindung vorausgesetzt.
                    Der Kunde müsste dann gar nichts mehr tun, außer sein Excel-File anzukllcken.

                    LG
                    Tom