Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    [SERVLET] Problema codifica caratteri nella response

    Ciao a tutti,

    ho un problema con la codifica dei caratteri in una servlet e ne esco...

    Queste sono le parti salienti del codice:

    codice:
    public class MyServlet extends HttpServlet
    { 
        @Override
        protected void doPost(HttpServletRequest request,
                              HttpServletResponse response) throws ServletException, IOException
        {
            ...
            ...
            
            String output = XmlConverter.toXml(xmlObject);
    
            response.setContentType("text/xml; charset=UTF-16");
            response.setCharacterEncoding("UTF-16");
            response.getWriter().println(output);
        }
    }
    Il codice che mi genera la stringa xml è il seguente:

    codice:
    public static String toXml(Object map)
    {
        XStreamGae xstream = new XStreamGae(new DomDriver("UTF-16", new XmlFriendlyNameCoder("_-", "_")));
        xstream.autodetectAnnotations(true);
        return xstream.toXML(map);
    }
    (la classe XStreamGae è una versione custom della classe XStream adattata per funzionare su Google App Engine, dove hosto la servlet.)

    Ora... Se faccio il deploy in locale tutto funziona alla perfezione.
    Se faccio il deploy su Google App Engine invece ho problemi coi caratteri: le lettere accentate le vedo come dei simboli strani, idem per altri caratteri "particolari".

    Perché?
    Da codice mi pare di aver specificato UTF16 ovunque... Cosa mi sfugge?

    Grazie
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Hai verificato, eventualmente con qualche tool o plugin del browser come è la response sia in locale sia su Google App Engine? Prova a vedere se ci sono differenze e quali.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da andbin
    Hai verificato, eventualmente con qualche tool o plugin del browser come è la response sia in locale sia su Google App Engine? Prova a vedere se ci sono differenze e quali.
    In effetti no, alla fine quello che vedo è solo l'xml...

    Ho trovata Tamper Data, stasera faccio qualche prova!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da andbin
    Hai verificato, eventualmente con qualche tool o plugin del browser come è la response sia in locale sia su Google App Engine? Prova a vedere se ci sono differenze e quali.
    Ho fatto qualche prova con Tamper Data.

    Queste sono le informazioni della response che Tamper Data mi mostra_

    Status=OK - 200
    Content-Type=text/xml; charset=UTF-16
    Content-Encoding=gzip
    Vary=Accept-Encoding
    Date=Wed, 25 Sep 2013 20:01:29 GMT
    Server=Google Frontend
    Cache-Control=private
    Content-Length=2607
    Alternate-Protocol=80:quic

    Quindi pare sia correttamente in UTF16...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Stasera proverò a zippare l'xml prima di mandarlo alla response e vedo come mi arriva...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Guarda, a me viene in mente solo una cosa al momento: pur non conoscendo quel XStreamGae, DomDriver e in generale quello che stai facendo, intuisco che il XML viene generato a partire dai dati in quel Object map.

    Cosa contiene il tuo oggetto specifico? Prende forse dati decodificandoli da altre fonti "binarie" (file o altro)? Non sarebbe la prima volta che sento di char "sballati" perché decodificati male "a monte".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da andbin
    Guarda, a me viene in mente solo una cosa al momento: pur non conoscendo quel XStreamGae, DomDriver e in generale quello che stai facendo, intuisco che il XML viene generato a partire dai dati in quel Object map.

    Cosa contiene il tuo oggetto specifico? Prende forse dati decodificandoli da altre fonti "binarie" (file o altro)? Non sarebbe la prima volta che sento di char "sballati" perché decodificati male "a monte".
    Quello che passo a toXml è una lista di oggetti Notice:

    codice:
    import java.util.List;
    import com.thoughtworks.xstream.annotations.XStreamAlias;
    
    @XStreamAlias("notice")
    public class Notice
    {
        private String           id;
    
        private String           title;
    
        @XStreamAlias("publication_date")
        private long             publicationDate;
    
        @XStreamAlias("last_update_date")
        private long             lastUpdateDate;
    
        private String           content;
    
        private List<Author>     authors;
    
        private List<Attachment> attachments;
    
        // getter/setter
    }
    Author e Attachment sono anch'esse annotate con @XStreamAlias.

    Ho notato ora il nome "map", come nome è sbagliato e fuorviante, poi lo cambio (una volta non avevo la classe Notice ma salvavo tutto in mappe di mappe, il nome viene da quello).

    Ti spiego brevemente la situazione.

    Ho fatto un'app per Windows Phone che mostra gli avvisi per gli studenti dell'università di Verona e dato che non ci sono delle API devo parsare la pagina a mano. Per evitare di appensatire l'app (soprattutto nei terminali di fascia bassa) e per via di alcuni limiti impostati dal SO ai processi in background ho pensato di farmi un servizietto web che si occupa di fare il grosso del lavoro, minimizzando anche la banda utilizzata (un conto è scaricare tutta la pagina degli avvisi e buttarne via la maggior parte, un conto è scaricare un xml con solo i dati che mi servono).

    L'app chiede alla servlet gli avvisi della facoltà X a partire dal giorno Y, questa fa una richiesta al sito dell'università, parsa il risultato e costruisce una lista di oggetti Notice. Poi faccio il toXml passando questa lista e l'app riceve un xml con il minimo indispensabile per funzionare.

    Per il parsing uso Jsoup, mi viene il dubbio ora che sia in questo la causa del problema... Farò delle prove
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Pare sia a monte il problema, leggo roba sporca fin dall'inizio... Solo che in locale non mi succede. Faccio ulteriori verifiche
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Risolto!!!

    L'errore era veramente banale: quando leggevo la risposta ottenuta dal sito dell'università non settato la codifica da usare: in locale di default andava in UTF8, sui server di google chissà cosa prendeva invece!

    In conclusione il pezzo incriminato era questo:

    codice:
       protected String readResponse() throws IOException
        {
            try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")))
            {
                String line = null;
                StringBuilder response = new StringBuilder();
                while ((line = br.readLine()) != null)
                {
                    response.append(line);
                }
                return response.toString();
            }
        }
    Ho colto l'occasione per passare da UTF16 a UTF8, vedo che va bene lo stesso

    Grazie ad andbin per la dritta!
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.