2010-10-14 8 views
18

karakter kümesini alamıyor Bir sunucudan bir şey indirmek için URL.openConnection() kullanıyorum. SunucuURLConnection,

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

Ama connection.getContentEncoding() döner null söylüyor. Naber?

+0

bu ilgili iplik kimseye yardımcı olabilir: http://stackoverflow.com/questions/9112259/obtaining-response-charset-of-response -to-get-veya-post-request- – Spoonface

+0

Ayrıca iyi bir neden connection.getContentEncoding() null döndürür: http header "Content-encoding" alanını döndürür, ** ** size verilecek değil bir karakter kümesi. Örneğin, alınan veriler sıkıştırılmışsa ve verileri dönüştürmek için kullanabilmeniz için size yol gösterecek şekilde kullanılmalıdır. https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 – jdarthenay

cevap

7

Bunun nasıl bir örnek kod .... yer verdik . getContentType() yöntemini kullanabilir ve elde edilen Dizeyi kendi başınıza çözümleyebilir veya Apache'dan biri gibi daha fazla advanced HTTP istemci kitaplığına gidebilirsiniz. Sadece @Buhake Sindi'nin cevabına ek olarak

27

değeri URLConnection.getContentEncoding() dönen İçerik türünü almak ve Content-Type karakter kümesini almak için yerine bir connection.getContentType() yapın Yerine

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

URLConnection.getContentEncoding() dan başlık Content-Encoding

Kanunundan değerini verir . Ben getContentEncoding() yöntem örnekte ayarlanmamış Content-Encoding HTTP başlığı, içeriğini döndürmek için belirtilen gibi bu davranışı belgelenmiştir

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

Bu yöntemler, OP'nin büyük olasılıkla konuştuğu HttpURLConnection'daki akla değerlerini döndürmek için geçersiz kılınır, bkz. http: // goo. gl/wt0P – Waldheinz

+0

@Waldheinz, Teşekkürler, ben bunu anladım ... bu yüzden benim ... –

+0

"substring()" argümanı "charset =" olmalıdır. "length() + 1' – bigstones

5

. Eğer Guava kullanıyorsanız, yerine manuel ayrıştırma yapabileceğiniz:

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