[php] Uitlezen van UTF-8 bron via socket

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • b19a
  • Registratie: September 2002
  • Niet online
Ik moet met een socket een bron uitlezen. Dit zou geen probleem hoeven zijn, ware het niet dat de server altijd UTF-8 oplevert. Het gaat om een html bron, via http server en ook al haal ik utf-8 uit accept-charset, de server blijft dat sturen.

Goed, ik lees de bron op de volgende manier uit (versimpeld):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    /**
     * Open socket and send header
     */
    $socket=fsockopen($url['host'],80);
    
    fwrite($socket,$header);
    
    
    /**
     * Start reading all the responses from the server
     */
    
    /**
     * Read until we get EOF from the server
     */
    $tmp="";
    while (!feof($socket)) {
      $tmp.=fgets($socket, 1024);
    }
    
    fclose($socket);

    echo $tmp;


Probleem is nu dat zodra ik die $tmp dump ik af en toe wat rare tekens zie opduiken waarvan ik denk dat ze door de UTF-8 encoding komen. Aan het begin van de body zie ik "1ff8" en halverwege een paar keer "2000".

Ik heb al het een en ander geprobeerd om de tekst om te zetten naar gewone ASCII, maar dit heeft nog niet mogen baten. Het gebruik van de multi-byte functies is helaas uitgesloten omdat dit niet ondersteund wordt op de server.

Wel weet ik dat dit probleem niet optrad bij het gebruik van file_get_contents. Deze functie kan ik echter niet gebruiken omdat ik controle moet hebben over de verzonden headers.

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Die gekke tekens komen niet door UTF-8, maar door de gebruikte Transfer-Encoding (chunked)..

Lees dit stuk er maar eens over :)

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Welkom in de wondere wereld van HTTP1/1 met chunked transfer encoding ;)
Met die trefwoorden moet je een stuk verder kunnen komen.

Die rare tekens die je ziet zijn in ieder geval hexadecimale getallen welke aangeven hoegroot het volgende blok, chunk, is.

Om jezelf de moeite te besparen een HTTP1/1 implementatie te schrijven, kun je ook file_get_contents() gebruiken om het bestand in te lezen, mits de http wrappers aanstaan

  • Osiris
  • Registratie: Januari 2000
  • Niet online
frickY schreef op donderdag 15 december 2005 @ 00:15:
Om jezelf de moeite te besparen een HTTP1/1 implementatie te schrijven, kun je ook file_get_contents() gebruiken om het bestand in te lezen, mits de http wrappers aanstaan
Nee, dat kan ie dus niet, aangezien ie custom headers heeft etc...

Misschien kan de TS kijken naar CURL. Custom header-meuk én een nette afhandeling door een nette PHP-lib :)

  • b19a
  • Registratie: September 2002
  • Niet online
Bedankt!

* b19a past meteen headers naar HTTP/1.0 aan en ziet de "gekke" tekens verdwijnen! :D

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Mjah, maar HTTP/1.0 ondersteunt de 'Host'-header weer niet, dus dan kun je problemen krijgen met hostname-based virtual hosts :)
Pagina: 1