2010-10-14 12 views
18

Sto utilizzando URL.openConnection() per scaricare qualcosa da un server. Il server diceURLConnection non ottiene il set di caratteri

Content-Type: text/plain; charset=utf-8 

Ma connection.getContentEncoding() rendimenti null. Cosa succede?

+0

questa discussione relativa potrebbe aiutare chiunque altro: http://stackoverflow.com/questions/9112259/obtaining-response-charset-of-response -to-get-or-post-request – Spoonface

+0

Anche c'è una buona ragione connection.getContentEncoding() restituisce null: restituisce il campo "Content-encoding" dell'intestazione http, che ** non è ** dovrebbe darti un set di caratteri. Dovrebbe essere usato ad esempio se i dati ricevuti sono compressi e ti dà il modo di usarli per trasformare i dati in modo che tu possa leggerli. https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 – jdarthenay

risposta

7

Questo è documentato il comportamento come il metodo getContentEncoding() è specificata per restituire il contenuto dell'intestazione Content-Encoding HTTP, che non è impostato nel tuo esempio . È possibile utilizzare il metodo getContentType() e analizzare la stringa risultante per conto proprio, o eventualmente utilizzare una libreria client HTTP advanced come quella da Apache.

27

Il valore restituito dal URLConnection.getContentEncoding() restituisce il valore di intestazione Content-Encoding

Codice da URLConnection.getContentEncoding()

/** 
    * Returns the value of the <code>content-encoding</code> header field. 
    * 
    * @return the content encoding of the resource that the URL references, 
    *   or <code>null</code> if not known. 
    * @see  java.net.URLConnection#getHeaderField(java.lang.String) 
    */ 
    public String getContentEncoding() { 
     return getHeaderField("content-encoding"); 
    } 

Invece, piuttosto che fare un connection.getContentType() per recuperare il Content-Type e recuperare il set di caratteri dal Content-Type . Ho incluso un codice di esempio su come fare questo ....

String contentType = connection.getContentType(); 
String[] values = contentType.split(";"); // values.length should be 2 
String charset = ""; 

for (String value : values) { 
    value = value.trim(); 

    if (value.toLowerCase().startsWith("charset=")) { 
     charset = value.substring("charset=".length()); 
    } 
} 

if ("".equals(charset)) { 
    charset = "UTF-8"; //Assumption 
} 
+0

Questi metodi sono sovrascritti per restituire i valori sane in HttpURLConnection di cui l'OP è più probabile che parli, vedere http: // goo. gl/wt0P – Waldheinz

+0

@Waldheinz, Grazie, l'ho capito ... quindi ho reupdato il mio post .... –

+0

l'argomento 'substring()' dovrebbe essere '" charset = ". length() + 1' – bigstones

5

Proprio come un'aggiunta alla risposta di @Buhake Sindi. Se si utilizza Guava, al posto del parsing manuale si può fare:

MediaType mediaType = MediaType.parse(httpConnection.getContentType()); 
Optional<Charset> typeCharset = mediaType.charset();