Я пытаюсь использовать GuzzleHTTP 6 для очистки веб-страниц, и до сих пор я не смог найти решение для перепутанной кодировки в теле ответа.
Допустим, я хочу проанализировать веб-страницу, которая возвращает данные на разных языках.
Инициализация клиента
public function __construct() {
$this->dataClient = new Client(['base_uri' => 'http://somewebsite.org/{language_code}']);
}
Использование клиента данных
$request = $this->dataClient->get('/endpoint/' . $data_query . '/');
$response = $request->getBody()->__toString();
$decoded = json_decode($response, true);
foreach ($decoded as $index => $data) {
$decoded[$index] = str_replace(['<option', '>', '</option>'], '', $data);
}
return $decoded;
Проблемы:
Если текст на английском языке, ответ выглядит почти нормально, за исключением того, что некоторые символы перепутаны.
манипуляция, есть
Вместо
manipulation, there's
Если я пытаюсь получить данные на любых других языках, я получаю вот что (данные на русском языке)
Ð;Ð;°; Ð;¿;Ð;µ;Ñ;€Ð;²;Ñ;‹Ð;¹; Ð;²;Ð
Вместо
На первый взгляд
И проблема в том, что если вы просматриваете веб-сайт, все хорошо и красиво, но если вы попытаетесь его очистить, вы столкнетесь с этими проблемами. Пока не могу найти источник проблемы, ни utf8_decode, ни iconv не помогают решить проблему.
Приветствуются любые решения!
Итак, небольшое обновление. Это функция разбора:
public function processData($data_query) {
$request = $this->dataClient->get('/endpoint/' . $data_query . '/');
$response = $request->getBody()->__toString();
// echo $response; - Everything is fine, no encoding problems
// return $response; - Encoding problems
$decoded = json_decode($response, true);
// return $decoded; - Encoding problems
foreach ($decoded as $index => $data) {
$decoded[$index] = str_replace(['<option', '>', '</option>'], '', $data);
}
return $decoded; - Encoding Problems
}
Необработанные заголовки ответа
{
Date: [
"Wed, 08 Jun 2016 01:45:30 GMT"
],
Server: [
"Apache"
],
X-Frame-Options: [
"SAMEORIGIN"
],
Retry-After: [
"600"
],
Content-Language: [
"en-GB"
],
Vary: [
"Accept-Encoding"
],
Transfer-Encoding: [
"chunked"
],
Content-Type: [
"text/html;charset=UTF-8"
]
}
Content-Type
в ответе? Должен (надеюсь) быть параметрcharset
. Что это говорит? Вы могли бы попытаться добавить заголовокAccept-Charset: UTF-8
. Это должно заставить сервер кодировать данные в UTF-8, если они реализованы правильно. - person Brad Frost   schedule 08.06.2016