2010-10-14 16 views
18

Estoy usando URL.openConnection() para descargar algo de un servidor. El servidor diceURLConnection no obtiene el juego de caracteres

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

Pero connection.getContentEncoding() vuelve null. ¿Que pasa?

+0

este tema relacionado podría ayudar a nadie: http://stackoverflow.com/questions/9112259/obtaining-response-charset-of-response -to-get-or-post-request – Spoonface

+0

También hay un buen motivo por el que connection.getContentEncoding() devuelve null: devuelve el campo "Content-encoding" del encabezado http, que ** no ** se supone que debe darte un conjunto de caracteres. Debería usarse, por ejemplo, si los datos recibidos están comprimidos y le da la forma de usarlos para transformar los datos y así poder leerlos. https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 – jdarthenay

Respuesta

7

Esto está documentado comportamiento como se especifica el método getContentEncoding() para devolver el contenido de la cabecera HTTP Content-Encoding, que no se encuentra en su ejemplo . Puede usar el método getContentType() y analizar la cadena resultante por su cuenta, o posiblemente obtener una biblioteca de cliente HTTP más advanced como la de Apache.

27

El valor devuelto por URLConnection.getContentEncoding() devuelve el valor de la cabecera Content-Encoding

Código de 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"); 
    } 

En su lugar, prefiere hacer una connection.getContentType() para recuperar el tipo de contenido y recuperar el juego de caracteres del tipo de contenido . He incluido un código de ejemplo sobre cómo hacer esto ....

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

Estos métodos se anulan para devolver valores sanos en HttpURLConnection, de los cuales el OP probablemente está hablando, consulte http: // goo. gl/wt0P – Waldheinz

+0

@Waldheinz, gracias, me di cuenta de eso ... por lo tanto, he vuelto a actualizar mi publicación ... –

+0

el argumento 'substring()' debe ser '" charset = ". length() + 1' – bigstones

5

Solo como una adición a la respuesta de @Buhake Sindi. Si está utilizando la guayaba, en lugar del análisis manual le servirán:

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