Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35

    Curl, e problema charset

    ciao,

    Stò cercando di prendere una pagina con curl, ed analizzarla.

    Il problema è che non riesco ad interagirci! Nel senso:

    Faccio la Curl e ottendo

    Codice PHP:
    $ch curl_init($link);    
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt ($chCURLOPT_COOKIEFILEgetcwd()."/cookie"); 
              
    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"
              
    $header[] = "Accept-Charset: utf-8;";
              
    curl_setopt($chCURLOPT_HTTPHEADER$header); 
            
    $source curl_exec($ch);
        
    curl_close($ch);
        
    settype($source"string");
        
        if(
    strpos($source'a')) echo "EVVAI!!!"; else echo "UFFAAA"
    il codice trova il sorgente, ma non trova manco un carattere "a" (e ce ne sn tanti!)

    La pagina mi arriva con charset iso-8859-1, ho pensato che fosse un problema di charset, per questo ho messo l'header nel curl con utf-8, ma niente!!

    Che poi la cosa strana se faccio un str_replace mi funziona perfettamente... ma con altre cose mi dà errore... ho provato anche a convertire la sorgente in utf-8 prima di elaborarla ma niente!
    Stò impazzendo perchè non trovo l'errore


    Non sò più che fare... qualcuno sà aiutarmi??

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Returns TRUE on success or FALSE on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, FALSE on failure.
    Quindi devi cambiare il tuo codice e aggiungere:

    codice:
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    In modo che al posto di restituire true o false a seconda del successo della chiamata ti restituisca il contenuto della pagina.

    Ciao

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35
    C'è già, è la prima riga dopo il curl_init

    E cmq il codice sorgente mi arriva per intero (l'ho stampato a video e non dava problemi) il problema stà nel confrontarlo...

  4. #4
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    ups... sfuggito..

    comunque alcune funzioni hanno problemi con l'utf8, ma non con l'iso.

    Qui c'è un articolo a riguardo.

    http://www.phpwact.org/php/i18n/utf-8

    Sinceramente senza poter provare con mano nn mi viene in mente altro da suggerirti, forse puoi provare con utf8encode / decode.

    Ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35
    mmmmh ho letto un po' l'articolo che hai postato, però è un argomento abb complicato e non riesco a capirlo a fondo in inglese. C'è qualcosa in italiano?

    Però c'è scritto che funzioni come strtolower ed explode possono avere problemi.
    Io li utilizzavo entrambe nel mio script!

    Ora faccio qualche test, però non ho capito delle cose.

    - La pagina che mi arriva è originariamente è ISO. Ma se io l'ho chiesta in UTF-8 nel mio curl non dovrebbe mandarmela codifica in UTF-8?

    - PHP che cosa usa come default quando esegue gli script?

    - Esiste una funzione che mi dice esattamente che charset usa una stringa?

  6. #6
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da Apollino
    mmmmh ho letto un po' l'articolo che hai postato, però è un argomento abb complicato e non riesco a capirlo a fondo in inglese. C'è qualcosa in italiano?

    Però c'è scritto che funzioni come strtolower ed explode possono avere problemi.
    Io li utilizzavo entrambe nel mio script!
    Si, "possono" perchè dipende da che caratteri ci sono nella stringa. Nell'utf8 alcuni caratteri speciali usano 2 byte per descrivere il carattere, e le funzioni problematiche invece danno per scontato che 1 carattere = 1 byte, cosi l'explode o il substr potrebbero spezzare la stringa a metà di un carattere.

    - La pagina che mi arriva è originariamente è ISO. Ma se io l'ho chiesta in UTF-8 nel mio curl non dovrebbe mandarmela codifica in UTF-8?
    Tu con quell'header dici quali charset accetta il client, teoricametne il server se non è in grado di restituirti i caratteri in utf8 dovrebbe darti un errore.
    Comunque il fatto che tu chieda in utf8 non vuol dire che ti arrivino correttamente, magari il server codifica in utf8 ma poi ti arrivano i caratteri scombinati.

    - PHP che cosa usa come default quando esegue gli script?
    Credo dipenda dal default charset impostato in apache, comunque io per sicurezza nei miei file php metto sempre il comando header per specificare manualmente :

    codice:
    header('Content-type: text/html;charset=utf-8');
    - Esiste una funzione che mi dice esattamente che charset usa una stringa?
    che io sappia no, esistono per la rete delle funzioni che ci provano alla ricerca di un carattere multybite all'interno della stringa, ma il punto è che la stringa "pippo" che non ha caratteri speciali è descritta allo stesso modo nello standard iso e nello standard utf8 quindi non puoi mai avere la sicurezza di quale sia la codifica.

    Per esperienza quando hai a che fare con testo creato da altri, l'unica cosa è fare un po' di tentativi con utf8encode/decode.

    Un'altra prova può essere fare un echo della pagina, e poi tramite il menu "visualizza" -> "codifica caratteri" provare a selezionare alternativamente iso e utf8 in modo da avere un colpo d'occhio visivo dei caratteri e individuare eventuali caratteri "strani".

    ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35
    Grazie per l'aiuto!

    Credo di aver trovato il problema.
    Ste codifiche sono un casino!

    Esiste la funzione mb_detect_encoding() che però la si deve specificare con un array, l'ordine in cui ricercare le codifiche! se no alcune codifiche te le dà sempre uguali perchè i caratteri corrispondono!
    (infatti se prima metti l'ISO del UTF-8 ti darà sempre iso come risultato anche se utf8!

    allora facendo dei test:

    Codice PHP:
    $ary = array("ASCII","UTF-8","ISO-8859-1");

    $S Sorgente del curl


    echo "
    "
    .mb_detect_encoding($S$ary);  = ISO-8859-1
    echo "
    "
    .mb_detect_encoding("</tr>"$ary); = ASCII
    echo "
    "
    .mb_detect_encoding(utf8_encode($S), $ary); = UTF-8
    echo "
    "
    .mb_detect_encoding(utf8_encode("</tr>"), $ary); = ASCII // Errore perchè converte solo ISO in UTF-8, quindi codifica strano e dice che è ASCII
    echo "
    "
    .mb_detect_encoding(utf8_decode($S), $ary); = ASCII //Ovviamente errore visto che non era utf8 ma iso, lo dà in ASCI, e non è ASCI!
    echo "
    "
    .mb_detect_encoding(utf8_decode("</tr>"), $ary);  = ASCII //Ovviamente errore visto che non era utf8 ma già ASCI, lo dà cmq come ASCII
    $S explode(utf8_decode($S), "</tr>"); 
    Ho l'ASCII come codifica base. devo solo trovare una funzione che mi converta l'ASCI in UTF-8 o ISO. Oppure imopostarmi l'UTF-8 come carattere predefinito, visto che l'header:
    Codice PHP:
    header('Content-type: text/html;charset=utf-8'); 
    non fa na sega : )
    Forse è per il browser client e non per il server php!

    (devo ancora cercarle le funzioni, ho preferito scriverlo qui prima xD)

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35
    Non riesco a trovare una funzione che codifichi come afferma....

    ho provato iconv e mb_convert_encoding, entrambe non mi convertono na sega!
    Tutto quello che produco è cmq considerato ASCII

  9. #9

    Re: Curl, e problema charset

    Codice PHP:
        if(strpos($source'a')) echo "EVVAI!!!"; else echo "UFFAAA"
    il codice trova il sorgente, ma non trova manco un carattere "a" (e ce ne sn tanti!)

    Che poi la cosa strana se faccio un str_replace mi funziona perfettamente
    Dubbio...e se provi con

    codice:
    if (stripos($source, 'a') !== false) {
       echo "EVVAI!!!";
     } else {
       echo "UFFAAA";
    }
    Uso stripos così la ricerca è case insensitive, inoltre uso un controllo strict perchè se la "a" fosse il primo carattere di $source, il tuo controllo ti restituirebbe 0 (posizione 0 nell'array) che viene convertito in FALSE e quindi ti stampa "uffa"


  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    35
    no allora il problema nn è così semplice ho sbagliato a scrivere l'esempio iniziale perchè pensavo non centrasse. (lo sò del === )

    Io facevo strtolower e poi lo strpos. Mi dava errore sullo strpos perchè lo strtolower si incasinava!!

    idem per l'explose! se faccio al codice sorgente explose($S, "</tr>") mi ritorna 1 risultato, al posto di 1000.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.