URLConnection не получает кодировку - PullRequest
19 голосов
/ 14 октября 2010

Я использую URL.openConnection() для загрузки чего-либо с сервера.Сервер говорит

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

Но connection.getContentEncoding() возвращает null.Как дела?

Ответы [ 3 ]

27 голосов
/ 14 октября 2010

Значение, возвращаемое из URLConnection.getContentEncoding(), возвращает значение из заголовка Content-Encoding

Код от 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");
    }

Вместо этого, вместо этого, введите connection.getContentType(), чтобы получить Content-Type и извлечь кодировку из Content-Type. Я включил пример кода о том, как это сделать ....

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
}
8 голосов
/ 14 октября 2010

Это задокументированное поведение, так как указан метод getContentEncoding() для возврата содержимого заголовка HTTP Content-Encoding, который не задан в вашем примере.Вы можете использовать метод getContentType() и проанализировать полученную строку самостоятельно или, возможно, воспользоваться более расширенной клиентской библиотекой HTTP, например, из Apache .

5 голосов
/ 18 мая 2014

Так же, как дополнение к ответу @Buhake Синди.Если вы используете Guava, вместо ручного разбора вы можете сделать:

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