Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] ftp ascii-datei in utf-8

Einklappen

Neue Werbung 2019

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

  • nebbiolo
    hat ein Thema erstellt [Erledigt] ftp ascii-datei in utf-8.

    [Erledigt] ftp ascii-datei in utf-8

    Hallo zusammen

    Ich habe auf meinem PC eine Datei die automatisch erstellt wird im Ascii-Format.
    Auf dem Server brauche ich diese aber im UTF-8 Format.

    Bis anhin habe ich diese jedes mal manuell mit den Editor geöffnet und im UTF-8 Format abgespeichert und dann mit einer Batch-Datei per ftp hochgeladen, gibt es eine Möglichkeit das mit PHP zu erledigen?

    Vielen Dank für Eure Hilfe!

    Grüsse, Nebbiolo

  • nebbiolo
    antwortet
    Natürlich allen Helfer vielen Dank und besonders mermshaus , der die Datei untersucht hat!
    Es ist für mich gar nicht selbstverständlich dass man sich in der heutigen, rasenden und materiellen Zeit noch die Mühe nimmt geduldig für andere Zeit zu opfern und sich kostenlos zur Verfügung stellt!

    Nochmals herzlichen Dank an ALLE!

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Marc hat sich die Mühe gemacht zu erklären, warum eine zeilenweises verarbeiten (mit fgets) nicht funktioniert (#31). Versuche es wenigstens zu verstehen. Denn ich wäre auf die Ursache nie gekommen. Auch von mir Daumen hoch für Marc.

    Einen Kommentar schreiben:


  • nebbiolo
    antwortet
    Sorry und Danke jspit - jetzt hat es geklappt. Ich habe Deine Variante auch schon früher versucht ... erfolglos, aber ich habe nicht nur die Dateinahmen ersetzt sondern auch Variablen verwendet ... aber was soll es - endlich geschafft )))

    OK, wir sind ja im Einsteigerforum ... ich laufe da schon am Limit ...

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Das ist vollkommener Murx. Warum schreibst du nicht die 3 Zeilen von mir ab und setzt deine Dateinamen da rein?
    file_get_contents und file_put-contents brauchen nicht fopen & Co, sondern die Dateinamen.

    Einen Kommentar schreiben:


  • nebbiolo
    antwortet
    PHP-Code:
    $inp fopen ("GC/geocache_visits_17.txt""r");   // Öffnet die Input-datei
    $out fopen ("GC/geocache_visits_17_utf.txt""w");  // Öffnet die Output-datei
    while ($inhalt file_get_contents ($inp))
      {
       
    $inhalt_neu mb_convert_encoding($inhalt,'UTF-8','UCS-2LE');
       
    file_put_contents($out$inhalt_neu);  // Schreibt in die Textdatei
      
    }
    fclose($out);  // Schließt die Output-datei
    fclose($inp);  // Schließt die Input-datei 
    ... nun habe ich es wie vorgeschlagen versucht ... warum bleibt die neu erstellt Datei leer? Syntaxfehler?
    die Input-Datei umfasst 17 Zeilen ...

    Einen Kommentar schreiben:


  • mermshaus
    antwortet
    Okay, vielleicht finde nur ich es amüsant, weil mein erster Versuch beim Rumbasteln war, einfach mal "BE" statt "LE" zu schreiben. (Wenn Chinesisch rauskommt, ist oft irgendwas mit den Bytes.) Das sah dann schon ganz gut aus, und ich hätte schon fast gepostet. Dann fiel mir aber auf, dass die erste Zeile noch immer Chinesisch ist. Habe dann ein wenig im Hex-Editor geguckt und mir gedacht: „Hm, seltsam. Die erste Zeile ist offensichtlich LE, der Rest scheint ja BE zu sein.“ Dann wollte ich hier posten mit…
    $encodingFrom = ($inhalt[0] === "\x00") ? 'UCS-2BE' : 'UCS-2LE';

    …, aber irgendwie… war das auch seltsam. Irgendwann ging mir dann ein Licht auf.

    Edit: Diesen – absolut herrlichen – Bug hatte ich auch zwischenzeitlich im Verdacht: http://blog.jonaspasche.com/2012/04/...-memory_limit/ (tolle Story)

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    Naja, amüsant... es ist vorhersehbar

    Anfangs hiess es, die Datei enthält nur ASCII - von UCS Kodierung war da noch nie die Rede.

    Aber 2 Daumen hoch für diese Analyse & Erklärung, mermshaus.

    Einen Kommentar schreiben:


  • mermshaus
    antwortet
    Es ist ganz amüsant, was da passiert.

    Die Datei ist durchgängig UCS-2LE. Das heißt, dass jeder Character mit zwei Bytes gespeichert ist. Bei den ASCII-kompatiblen Characters (sind in der Datei alle, glaube ich) bleibt dabei immer ein Byte komplett leer (0x00). Weil es LE ist, ist es das zweite Byte. Bei BE wäre es das erste Byte. (Im Hinterkopf behalten.)

    Die erste Zeile, die per fgets() eingelesen wird, sieht nun hexadezimal so aus:

    Code:
    4700 4300 3400 4d00 3600 5900 4300 2c00 3200 3000 ... 4200 4200 2200 0d00 0a
    Immer hübsch ASCII-Byte und NUL-Byte – nur ganz hinten beim 0x0a (was der "\n"-Umbruch ist) fehlt das NUL-Byte, weil fgets() eben stumpf bis zum ersten "\n" liest. (Es gibt dazu eine Ini-Einstellung, aber die spielt hier keine Rolle.)

    Das heißt, das NUL-Byte, das zu 0x0a gehört, wird dann zu Beginn der nächsten Zeile mit ausgelesen. Die nächste Zeile sieht dann so aus:

    Code:
    0047 0043 0034 004d 0059 0052 ... 0042 0042 0042 0022 000d 000a
    Und das wäre dann eben genau UCS-2BE und nicht mehr LE.

    Das geht dann die nachfolgenden Zeilen so weiter, und ganz zum Schluss fällt noch eine Zeile raus, die nur ein 0x00 enthält.


    fgets() eignet sich also einfach nicht dazu, UCS-2LE auszulesen.

    fread() wäre, wie erwähnt, eine Option, solange die Buffergröße durch 2 teilbar ist.[1] file_get_contents() geht immer.



    1: Zumindest, wenn dann „on the fly“ konvertiert wird, statt erst alles einzulesen. Für das Konvertieren ist eben wichtig, dass keine Characters in der Mitte getrennt werden.

    Einen Kommentar schreiben:


  • erc
    antwortet
    Mit der Datei ist alles in Ordnung. Scheint so als ob fgets ein Problem hat und beim Zeilenumbruch ein Byte verschluckt. Machs mit fread oder noch einfacher mit file_get_contents/file_put_contents.

    Einen Kommentar schreiben:


  • jspit
    antwortet
    Wo dein Problem liegt ist mir schleierhaft. Ein kurzer Test:
    PHP-Code:
    $content file_get_contents('forum/geocache_visits_17.txt');

    $utf8_codierter_inhalt_der_datei mb_convert_encoding($content 'UTF-8''UCS-2LE');

    file_put_contents('forum/geocache_visits_17_utf8.txt',$utf8_codierter_inhalt_der_datei); 
    Das Ergebnis ist eine reine ASCII-Datei ( ASCII ist eine Untermenge von UTF-8 ).

    Am Rande:
    Zitat von nebbiolo Beitrag anzeigen
    ich habe nun einiges gelesen über iconv() ... da kann/muss man ja sogar zeichen zur umwandlung angeben ... recht kompliziert
    Wo hast du denn das her?
    iconv() ist genau so einfach handzuhaben wie mb_convert_encoding().

    Einen Kommentar schreiben:


  • nebbiolo
    antwortet
    Seit neustem schaue ich mir die Daten mit notepad++ an, deshalb kenn ich ja auch die Codierung

    geocache_visits_17.zip
    Angehängte Dateien

    Einen Kommentar schreiben:


  • erc
    antwortet
    Zitat von nebbiolo Beitrag anzeigen
    leider wurde durch die chinesischen Zeichen etwas "abgeschnitten" ... hier noch der UCS-2LE-Input, wobei die Leerstellen im Editor mit "nul" angezeigt werden.
    G C 4 M 6 Y C , 2 0 1 4 - 1 1 - 0 7 T 0 8 : 4 6 Z , F o u n d i t , " B B B "

    G C 4 M Y R X , 2 0 1 4 - 1 1 - 0 7 T 0 8 : 5 2 Z , F o u n d i t , " B B B "

    Was mache ich da falsch?
    Zitat von erc Beitrag anzeigen
    Das sieht nicht nach einem Zeichensatzproblem aus. Wie schaust du dir die Dateien an? Was passiert wenn du die Datei hochlädst und wieder runter? Häng am besten mal die orginal Datei an (als zip).
    Entweder ist die Orginaldatei schon korrupt (womit aber dein Editor zurecht kommt) oder sie wird beim upload beschädigt.

    Einen Kommentar schreiben:


  • nebbiolo
    antwortet
    leider wurde durch die chinesischen Zeichen etwas "abgeschnitten" ... hier noch der UCS-2LE-Input, wobei die Leerstellen im Editor mit "nul" angezeigt werden.
    G C 4 M 6 Y C , 2 0 1 4 - 1 1 - 0 7 T 0 8 : 4 6 Z , F o u n d i t , " B B B "

    G C 4 M Y R X , 2 0 1 4 - 1 1 - 0 7 T 0 8 : 5 2 Z , F o u n d i t , " B B B "

    Was mache ich da falsch?

    Einen Kommentar schreiben:


  • nebbiolo
    antwortet
    Danke erc, der erste Datensatz ist nun ok, aber dann
    PHP-Code:
    $inp fopen ("GC/test-datei.txt""r");   // Öffnet die Input-datei
    $out fopen("GC/test-datei1.txt""w");   // Öffnet die Output-datei
    while ($inhalt fgets ($inp4096 ))
      {
       
    $inhalt_neu mb_convert_encoding($inhalt,'UTF-8','UCS-2LE');
       
    fwrite($out,$inhalt_neu."\r\n");   // Schreibt in die Textdatei
      
    }
    fclose($out);  // Schließt die Output-datei
    fclose($inp);  // Schließt die Input-datei 
    GC4M6YC,2014-11-07T08:46Z,Found it,"BBB"

    䜀䌀㐀䴀夀刀

    Einen Kommentar schreiben:

Lädt...
X