Toon posts:

[PHP] character encoding probleem bij binnenhalen file

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zo, kom ik ook eens bij de buren :P

met een functie die ik van php.net geplukt heb haal ik de contents van een url binnen:
(zie http://nl2.php.net/manual/nl/function.file.php)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function fetchUrlWithoutHanging($url) {
   $numberOfSeconds=4;   

   error_reporting(0);

   $url = str_replace("http://","",$url);
   $urlComponents = explode("/",$url);
   $domain = $urlComponents[0];
   $resourcePath = str_replace($domain,"",$url);
   $socketConnection = fsockopen($domain, 80, $errno, $errstr, $numberOfSeconds);
   if (!$socketConnection) {
    return(false);
   } else {
       $xml = '';
       fputs($socketConnection, "GET /$resourcePath HTTP/1.0\r\nHost: $domain\r\n\r\n");
       while (!feof($socketConnection)) {
           $xml .= fgets($socketConnection, 128);
       } 
       fclose ($socketConnection);
   }
   return($xml);
}


dit gaat allemaal redelijk ok (niet helemaal, maar dat fix ik wel en heeft ook weinig met het probleem te maken), alleen gaat er iets helemaal mis met de character encoding

als ik een UTF-8 gecodeerde file ophaal (bv http://www.google.com.ua waar je mooi cyrillisch verwacht) en deze direct weer output (de pagina wordt geserveerd als UTF-8 ook), dan kloppen de tekens toch echt niet.

Nu heb ik wel een functietje gevonden die checked of een string UTF-8 is (http://nl3.php.net/manual/nl/function.utf8-encode.php, bovenste commentaar):
PHP:
1
2
3
function isUTF8($string) {
   return (preg_match('/^([\x00-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xec][\x80-\xbf]{2}|\xed[\x80-\x9f][\x80-\xbf]|[\xee-\xef][\x80-\xbf]{2}|f0[\x90-\xbf][\x80-\xbf]{2}|[\xf1-\xf3][\x80-\xbf]{3}|\xf4[\x80-\x8f][\x80-\xbf]{2})*$/', $string) === 1);
}


maar ten eerste heb ik geen idee of deze functie naar behoren werkt en ten tweede wordt bv die google pagina al geserveerd als UTF-8, dus ik zou die functie helemaal al niet nodig hebben.

Hoe zorg ik nu voor dat de content van die pagina wél correct gepresenteert wordt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
even een kick met misschien nog relevante aanvullende info (zijn jullie me nou aan het boycotten omdat ik van /13 ben? :P)

die functie isUTF8 geeft iig aan dat de string die ik van de externe site binnenhaal géén UTF-8 is. Met bijvoorbeeld de genoemde google pagina (http://www.google.com.ua/) krijg ik als ik die string direct serveer alleen maar vraagtekens. Als ik 'm door utf8_encode() haal, krijg ik troep.

is ook niet raar want het lijkt me sterk dat die string ISO-8859-1, waar die functie wel van uit gaat.

Die pagina wordt dus wél als utf-8 geserveerd.

Verder als ik in plaats van bovengenoemde functie om de file op te halen file_get_contents() gebruik heb ik precies hetzelfde probleem.

Acties:
  • 0 Henk 'm!

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 07-11-2023

kvdveer

Z.O.Z.

't is een beetje een gok, maar kan het niet zo zijn dat file_get_contents de data direct vertaalt naar ISO-nogwattes? Of dat dat gebeurt misschien in de fopenwrappers (iets waarschijnlijker)?

Probeer eens de PEAR HTTP-client, dan werk je under the hood met echte sockets, waar je iig zeker kunt zijn dat er geen vertaling plaats vindt.

Localhost, sweet localhost


Acties:
  • 0 Henk 'm!

Verwijderd

Het heeft te maken met Google, welke afhankelijk van de request een andere encoding terugstuurt.

Acties:
  • 0 Henk 'm!

Verwijderd

Misschien moet je nog een Accept-Charset-header ofzo toevoegen aan je request?

Acties:
  • 0 Henk 'm!

Verwijderd

Waarschijnlijk, hoewel Google 'Accept-Language' ook niet volgt... (Ze gokken een beetje op basis van IP.)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
zow, ik ben eruit

Accept header toevoegen had geen resultaat, dus ik ben maar eens begonnen met een firefox GET request te doen, daar heb ik vanaf gesnoept wat er af kon.

Blijkt dus dat google een User-Agent string nodig had, en ook niet zomaar iets, blijkbaar moet ie iets hebben wat ie herkent, anders stuurt ie gewoon geen UTF-8. Alleen "Mozilla/5.0" is voldoende, "Mozilla/1.0" werkt bijvoorbeeld niet, "Foep/5.0" ook niet.

Verder is de Accept-Charset header voor google niet relevant. Ik krijg ook UTF-8 als ik 'm weglaat, maar desondanks laat ik 'm er toch maar in.
Pagina: 1