[PHP]Mac txt bestanden inlezen met php op linux server

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Ik heb een website gemaakt waarvan de content via txt files geupdate kan worden.
Diegene die de website bijhoudt doet dit nu vanaf een mac, slaat dit op als unicode txt bestanden en opent hem dan op een windows pc in notepad en slaat het dan als een gewoon txt bestand op zodat de linux server waar de website op draait hem normaal in kan lezen.

De bedoeling is dat deze tussenstap er tussenuit gehaald wordt. Ik nam aan dat het enige verschil in txt bestand was dat de endline een andere code is op de mac.

Ik gebruikte eerst de functie file() om het geheel in een array te krijgen per regel, maar deze kan ik niet gebruiken als de endline character anders is.

Ik gebruik nu de volgende code, maar het probleem is dat hij opeens de spaties niet herkend, en aan het begin een þÿ neerzet om een of andere reden.

Mijn vraag is uiteraard of iemand hier ervaring in heeft of een oplossing weet voor dit probleem.

de inlees code, ipv print_r heb ik uiteraard iets anders staan
PHP:
1
2
  $handle = fopen($textpath[0], "r");
  print_r(explode("\r", fread($handle, filesize($textpath[0]))));


de uitvoer: dit zijn de eerste twee, rest is precies hetzelfde
code:
1
Array ( [0] => þÿIndrukwekkendenieuwbouwinEnter [1] => Colisserichtzichopproductontwikkeling

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

[google]convert mac newline to unix php[/google] :?

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Die 'þÿ' is de BOM (Byte Order Mark) die UTF files wel eens gebruiken. Op die term is vast wel wat te vinden.

Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
SchizoDuckie schreef op maandag 16 juli 2007 @ 16:00:
[google]convert mac newline to unix php[/google] :?
Dat gaat over newlines. Zoals je ziet heb ik daar geen problemen mee. Hij herkent alleen opeens de spaties niet en de eerste twee karakters zijn opeens þÿ

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
file()

En dan goed doorlezen:
Note: If you are having problems with PHP not recognizing the line endings when reading files either on or created by a Macintosh computer, you might want to enable the auto_detect_line_endings run-time configuration option.
Ie, even dit aanroepen voor file():
PHP:
1
ini_set('auto_detect_line_endings', true);


Werkt wel pas vanaf PHP 4.3, maar als je file() kan gebruiken beschik je daar toch wel over :)

[ Voor 18% gewijzigd door FragFrog op 16-07-2007 19:16 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Nogmaals: die meuk aan het begin staat er omdat het een (waarschijnlijk UTF-8) encoded bestand is, die dus een andere encoding heeft dan de standaard encoding die wordt gebruikt op het systeem.

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Dan wat let je utf8_decode() aan te roepen? :?

//edit
Sorry Cheatah, dacht even dat jij de TS was ;) Resultaat blijft natuurlijk hetzelfde, decoden die hap :+ Lijkt er trouwens op dat file() dat zelf al doet als de TS daarmee niet dezelfde problemen tegenkomt.

[ Voor 52% gewijzigd door FragFrog op 17-07-2007 00:57 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
FragFrog schreef op maandag 16 juli 2007 @ 19:14:
file()

En dan goed doorlezen:

[...]


Ie, even dit aanroepen voor file():
PHP:
1
ini_set('auto_detect_line_endings', true);


Werkt wel pas vanaf PHP 4.3, maar als je file() kan gebruiken beschik je daar toch wel over :)
Dank je wel, ik had dit wel zien staan op php.net maar ik kreeg die ini_set aanroep niet goed voor elkaar. Hiermee pakt ie hem wel. Nog steeds is het resultaat nog niet precies zoals de bedoeling is.
Ik doe nu het volgende:
PHP:
1
2
3
4
  ini_set('auto_detect_line_endings', true);        
  $return = file($txtpath);
  for($i=0;$i<sizeof($return);$i++)
    $return[$i] = utf8_decode($return[$i]);


Als ik dan een print_r() doe van $return krijg ik dit:
code:
1
Array ( [0] => ?ndrukwekkendenieuwbouwinEnter [1] => Culisserichtzichopproductontwikkeling


Die Byte Order Mark pakt ie nog niet helemaal lekker met utf8_decode. Hiervoor had ik wel een inleesmethode die de eerste 3 bytes overslaat. De output daarvan kan ik echter niet gebruiken in file, omdat file een path naar een textfile wil hebben. Of ik zou dus eerst de textfile moeten open, aanpassen en weer opslaan. imho een beetje overdreven.

Ook pakt ie de spaties nog steeds niet lekker. Nog steeds beetje naar dus. Alvast bedankt voor de tips de goede kant op, maar heeft iemand misschien nog een idee?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Die '?' komt denk doordat je browser misschien geen utf8 headers binnenkrijgt? Waarom haal je em uberhaupt nog weer door utf8_decode heen? Ik zou gewoon het zo laten en de rest van je content ook uitspugen als utf8.

Acties:
  • 0 Henk 'm!

  • hornage
  • Registratie: November 2001
  • Laatst online: 24-09-2024
Cartman! schreef op dinsdag 17 juli 2007 @ 14:20:
Die '?' komt denk doordat je browser misschien geen utf8 headers binnenkrijgt? Waarom haal je em uberhaupt nog weer door utf8_decode heen? Ik zou gewoon het zo laten en de rest van je content ook uitspugen als utf8.
Zoals eerder genoemd komt dat vraagteken door de Byte Order Mark. Ik haal hem door de decode om leestekens en die Byte Order Mark eruit te halen zoals eerder voorgesteld werd. Als ik geen ut8_decode doe krijg ik nl het volgende wat precies hetzelfde is wat in de OP heb gezet.
code:
1
Array ( [0] => þÿIndrukwekkendenieuwbouwinEnter [1] => Colisserichtzichopproductontwikkeling

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
hornage schreef op dinsdag 17 juli 2007 @ 15:38:
[...]

Zoals eerder genoemd komt dat vraagteken door de Byte Order Mark. Ik haal hem door de decode om leestekens en die Byte Order Mark eruit te halen zoals eerder voorgesteld werd. Als ik geen ut8_decode doe krijg ik nl het volgende wat precies hetzelfde is wat in de OP heb gezet.
code:
1
Array ( [0] => þÿIndrukwekkendenieuwbouwinEnter [1] => Colisserichtzichopproductontwikkeling
Dat van die BOM heb ik zelf gemeld hoor, rustig. Kun je die BOM er niet gewoon uithalen met een str_replace?

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
PHP:
1
2
  for($i=0;$i<sizeof($return);$i++) 
    $return[$i] = utf8_decode($return[$i]);


Hier hebben ze array_map() voor uitgevonden trouwens ;)

Maw:
PHP:
1
$decoded = array_map('utf8_decode', $return);


Blijft het natuurlijk wel vaag dat spaties zomaar lijken te verdwijnen. Kun je'm op de mac ook als ander bestandstype opslaan?

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1