с httpclient есть ли способ получить набор символов страницы с запросом HEAD? - PullRequest
2 голосов
/ 10 июля 2010

Я делаю простой запрос HEAD с использованием библиотеки httpclient.Мне любопытно, как я смогу получить набор символов, который возвращает apache Например: utf-8, iso-8859-1 и т. Д ... спасибо!

  HttpParams httpParams = new BasicHttpParams();
  HttpConnectionParams.setConnectionTimeout(httpParams, 2000);
  HttpConnectionParams.setSoTimeout(httpParams, 2000);

  DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
  httpclient.getParams().setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");

  HttpContext localContext = new BasicHttpContext();
  httpget = new HttpHead(url); 

  HttpResponse response = httpclient.execute(httpget, localContext);

  this.sparrowResult.statusCode = response.getStatusLine().getStatusCode();

РАБОЧИЙ РЕЗУЛЬТАТ ОБНОВЛЕНО

Header contentType = response.getFirstHeader("Content-Type");
String charset= contentType.getValue();

Ответы [ 4 ]

18 голосов
/ 23 ноября 2012

При использовании HttpClient 4.2

import java.nio.charset.Charset;
import org.apache.http.entity.ContentType;

ContentType contentType = ContentType.getOrDefault(entity);
Charset charSet = contentType.getCharset();
4 голосов
/ 20 августа 2011

При использовании HttpClient 4.1 (последняя версия):

import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

String charset = EntityUtils.getContentCharSet(entity);
if (charset == null) {
    charset = HTTP.DEFAULT_CONTENT_CHARSET;
}
2 голосов
/ 10 июля 2010

в HTTP 1.1, набор символов находится в заголовке типа содержимого

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8

Так что это должно быть скрыто в

HttpResponse.Headers

Итак, это должно работать

HttpResponse.Headers.["Content-Type"]

** не проверял это, но вы поняли

1 голос
/ 13 января 2016

В некоторых случаях сервер не выдаст вам кодировку в заголовке, но она будет записана в содержании, например, этот URL: http://seniv.dlmostil.ru/jacket/p/kupit-sportivnie-bryki-adidas-s-dostavkoy/

Когда вы выполните

ContentType contentType = ContentType.getOrDefault(entity); 
Charset charSet = contentType.getCharset();

, тоcharSet равен null .

В этом случае я читаю поток и пытаюсь извлечь charSet из HTML-кода с помощью регулярного выражения, поэтому при чтении содержимого из входного потока в

ByteArrayOutputStream out = new ByteArrayOutputStream();

тогда вы можете сделать это:

String help = new String(out.toByteArray());
Pattern charSet = Pattern.compile("charset\\s*=\\s*\"?(.*?)[\";\\>]", Pattern.CASE_INSENSITIVE);
Matcher m = charSet.matcher(help);
String encoding = m.find() ? m.group(1).trim() : "UTF-8";
if (Charset.availableCharsets().get(encoding) == null) encoding = Charsets.UTF_8.toString();
String html = new String(out.toByteArray(), encoding);

Я надеюсь, вы получите представление об этом последнем выходе, когда все другие методы не будут работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...