2010-10-14 13 views
18

Używam URL.openConnection(), aby pobrać coś z serwera. Serwer mówiPołączenie URL nie pobiera zestawu znaków

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

Ale connection.getContentEncoding() powraca null. Co słychać?

+0

ten wątek związany może pomóc nikogo innego: http://stackoverflow.com/questions/9112259/obtaining-response-charset-of-response -to-get-or-post-request – Spoonface

+0

Istnieje również dobry powód connection.getContentEncoding() zwraca null: zwraca pole "Content-encoding" nagłówka http, które ** nie powinno ** dawać ci zestaw znaków. Powinno być używane na przykład wtedy, gdy odebrane dane są skompresowane i daje możliwość użycia ich do transformacji danych, abyś mógł je przeczytać. https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11 – jdarthenay

Odpowiedz

7

Jest to udokumentowane zachowanie jako metoda getContentEncoding() jest określona, ​​aby przywrócić zawartość nagłówka Content-Encoding HTTP, który nie mieści się w swoim przykładzie . Można użyć metody getContentType() i samemu przeanalizować wynikowy ciąg lub ewentualnie uzyskać bibliotekę klienta HTTP bardziej podobną do tej z Apache.

27

Wartość zwracana z URLConnection.getContentEncoding() zwraca wartość z nagłówka Content-Encoding

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

Zamiast raczej zrobić connection.getContentType() pobrać Content-Type i odzyskać charset od Content-Type . Podaję przykładowy kod, w jaki sposób to zrobić ....

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

Te metody są nadpisywane w celu zwrócenia normalnych wartości w HttpURLConnection, o czym najprawdopodobniej mówi OP, zobacz http: // goo. gl/wt0P – Waldheinz

+0

@Waldheinz, Dzięki, wymyśliłem to ... stąd zreupdowałem mój wpis .... –

+0

Argument 'substring()' powinien być '" charset = ". length() + 1' – bigstones

5

Podobnie jak dodatek do odpowiedzi z @Buhake Sindi. Jeśli używasz guawy, zamiast ręcznego parsowania można zrobić:

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