Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Errore di codifica nella lettura da URL

    Ciao a tutti, sto cercando di usare il web service per il meteo di google, le query sono di questo tipo:
    http://www.google.com/ig/api?weather=roma&hl=it

    Recupero i dati usando la classe URL passandogli una query come quella sopra.

    Se la query la faccio in inglese (parametro hl=en) funziona tutto, invece in italiano quando tento di ottenere l'inputStream mi lancia una IOException con questo messaggio:
    Invalid byte 2 of 3-byte UTF-8 sequence
    Facendo un po' di prove ho visto che il server di google specifica la codifica UTF-8 mentre in realtà è iso-8859-1.

    Come posso fare per leggere il file con codifica iso-8859-1 ?
    Coltiva Linux, Windows si pianta da solo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Errore di codifica nella lettura da URL

    Originariamente inviato da loHacker
    Ciao a tutti, sto cercando di usare il web service per il meteo di google, le query sono di questo tipo:
    http://www.google.com/ig/api?weather=roma&hl=it

    Recupero i dati usando la classe URL passandogli una query come quella sopra.

    Se la query la faccio in inglese (parametro hl=en) funziona tutto, invece in italiano quando tento di ottenere l'inputStream mi lancia una IOException con questo messaggio:


    Facendo un po' di prove ho visto che il server di google specifica la codifica UTF-8 mentre in realtà è iso-8859-1.
    No. Da browser, provando http://www.google.com/ig/api?weather=roma&hl=it e scaricandolo su file si vede bene (con un hex editor) che ad esempio Umidità è composto dai byte 55 6D 69 64 69 74 C3 A0, dove C3 A0 è proprio la codifica UTF-8 per la "à".

    E d'altronde se nel XML non c'è l'encoding dichiarato (come nel caso di questo documento specifico), si deduce l'encoding dal BOM (byte order mark) ma se non c'è nemmeno questo è comunque per default UTF-8. E il Content-Type su HTTP tra l'altro corrisponde essendo anchh'esso UTF-8.

    Quindi di una cosa si può essere certi: quel documento è in UTF-8.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ciao e grazie per la risposta.
    Da cosa è dato allora l'errore nella lettura?

    La validazione del file mi da un warning sulla codifica:
    http://validator.w3.org/check?verbos...roma%26hl%3Dit

    Il codice che uso è di questo tipo:
    codice:
    URL service = new URL("http://www.google.com/ig/api?weather=roma&hl=it");
    URLConnection sc = service.openConnection();
    InputStream is = sc.getInputStream();
    L'eccezione viene lanciata da getInputStream().
    Coltiva Linux, Windows si pianta da solo!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da loHacker
    La validazione del file mi da un warning sulla codifica:
    http://validator.w3.org/check?verbos...roma%26hl%3Dit
    Sono solo dei warning.
    Il primo dice "guarda, non c'è il DOCTYPE" ma è comunque ok. Il fatto che manchi il DOCTYPE vuol solo dire che non ci sono informazioni sulla "semantica", che descrivono ad esempio che dentro <forecast_information> ci deve/può essere <city> ecc...
    Ma se non ci sono queste informazioni non è nulla di grave. Vuol dire che non si può validarlo ma solo verificare se è "well formed".
    Il secondo dice "guarda, non c'è l'encoding". Ma anche qui nulla di grave, se non c'è il BOM (che può indicare, limitatamente, qualcosa), per default è comunque UTF-8.

    Originariamente inviato da loHacker
    Il codice che uso è di questo tipo:
    codice:
    URL service = new URL("http://www.google.com/ig/api?weather=roma&hl=it");
    URLConnection sc = service.openConnection();
    InputStream is = sc.getInputStream();
    L'eccezione viene lanciata da getInputStream().
    Provato, ma a me non dà alcuna eccezione. E non vedo come potrebbe visto che getInputStream() fornisce solo lo stream "crudo" di byte e non centra nulla con encoding o caratteri.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Hai ragione, l'errore me lo da quando faccio il parsing dell'xml:
    codice:
    URL service = new URL("http://www.google.com/ig/api?weather=roma&hl=it");
    URLConnection sc = service.openConnection();
    InputStream is = sc.getInputStream();
    
    //Parsing DOM
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = builderFactory.newDocumentBuilder();
    
    Document doc = docBuilder.parse(is);
    È il metodo parse che mi lancia la IOException.
    Coltiva Linux, Windows si pianta da solo!

  6. #6
    Ok, ho risolto tutto. Per chi ne avesse bisogno questo è il codice che ho usato:
    codice:
    URL service = new URL("http://www.google.com/ig/api?weather=roma&hl=it");
    URLConnection sc = service.openConnection();
    InputStream is = sc.getInputStream();
    
    //Uso InputSource per poter specificare l'encoding
    InputSource inputSource = new InputSource(is);
    inputSource.setEncoding("ISO-8859-1");
    
    //Parsing DOM
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = builderFactory.newDocumentBuilder();
    
    Document doc = docBuilder.parse(inputSource);
    Coltiva Linux, Windows si pianta da solo!

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.