2010-10-14 26 views
18

J'utilise URL.openConnection() pour télécharger quelque chose à partir d'un serveur. Le serveur ditURLConnection n'obtient pas le jeu de caractères

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

Mais connection.getContentEncoding() retours null. Qu'est-ce qu'il y a?

+0

ce fil connexe pourrait aider quelqu'un d'autre: http://stackoverflow.com/questions/9112259/obtaining-response-charset-of-response -t-get-or-post-request – Spoonface

+0

Il y a aussi une bonne raison connection.getContentEncoding() renvoie null: il retourne le champ "Content-encoding" de l'en-tête http, qui ** n'est pas supposé vous donner un jeu de caractères. Il devrait être utilisé par exemple si les données reçues sont compressées et vous donne le moyen d'utiliser pour transformer les données afin que vous puissiez les lire. https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 – jdarthenay

Répondre

7

Ce comportement est documenté comme la méthode getContentEncoding() est spécifiée pour renvoyer le contenu de l'en-tête HTTP Content-Encoding, qui n'est pas défini dans votre exemple . Vous pouvez utiliser la méthode getContentType() et analyser la chaîne résultante par vous-même, ou opter pour une bibliothèque client HTTP advanced plus similaire à celle de Apache.

27

La valeur retournée par URLConnection.getContentEncoding() renvoie la valeur de tête Content-Encoding

code 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"); 
    } 

Au lieu de cela, plutôt faire un connection.getContentType() pour récupérer le type de contenu et récupérer le charset du Content-Type . J'ai inclus un exemple de code sur la façon de le faire ....

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

Ces méthodes sont remplacées pour renvoyer des valeurs saines dans HttpURLConnection dont l'OP est le plus susceptible de parler, voir http: // goo. gl/wt0P – Waldheinz

+0

@Waldheinz, Merci, je l'ai compris ... d'où j'ai rualdated mon poste .... –

+0

l'argument 'substring()' devrait être '" charset = ". length() + 1' – bigstones

5

Juste comme un complément à la réponse de @Buhake Sindi. Si vous utilisez Goyave, au lieu de l'analyse syntaxique manuel que vous pouvez faire:

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