CURL как перекодировать ответ?

S
На сайте с 13.11.2012
Offline
72
3327

С помощью curl получаю данные со стороннего сайта, изначально его кодировка не известна. В случае если кодировка windows-1251 получаю не читаемый сайт (испорчена кодировка), мне нужно отображать utf-8.

iconv("windows-1251", "UTF-8", $post); - помогает, НО если изначально кодировка и так utf-8 сайт я не получаю - белая страница.

curl_setopt($rCurl, CURLOPT_ENCODING, 'gzip,deflate'); - не помогло вообще.

Нашел как мне кажется решение моей проблемы:

<?php
$tab = array("UTF-8", "ASCII", "Windows-1251", "Windows-1252", "ISO-8859-15", "ISO-8859-1", "ISO-8859-6", "CP1256");
$chain = "";
foreach ($tab as $i)
{
foreach ($tab as $j)
{
$chain .= " $i$j ".iconv($i, $j, "$my_string");
}
}

echo $chain;
?>

Как я понял, данная функция должна определить изначальную кодировку и потом, при необходимости изменить ее, но совладать с этим кодом я не смог.

Я не понял, где нужно задать нужную мне UTF-8 кодировку.

Мне кажется, что из строки $tab = array нужно удалить UTF-8, так как именно эта кодировка мне и нужна.

Пробовал еще так сделать:

function convert_utf8( $post ) {
if ( strlen(utf8_decode($post)) == strlen($post) ) {
// $string is not UTF-8
return iconv("windows-1251", "UTF-8", $post);
} else {
// already UTF-8
return $post;
}
}
echo $post;

не помогло.

Сделал так и решил проблему:

$isWinCharset = mb_check_encoding($post, "windows-1251");
if ($isWinCharset) {
$post = iconv("Windows-1251", "UTF-8", $post);
}

Потом нашел пару сайтов, где код не помог.

В мета у сайтов стоит кодировка utf-8 но сам файл видимо в другой кодировке, из-за чего на сайте появляются иероглифы, пример такого сайта:

indikator.one-trading.ru

Если убрать

$isWinCharset = mb_check_encoding($post, "windows-1251");
if ($isWinCharset) {
$post = iconv("Windows-1251", "UTF-8", $post);
}

то сайт отображается корректно НО слетают сотни других, которые изначально в Windows-1251 кодировке.

Можно как-то зафиксировать эту проблему, возможно я что-то не так понимаю и сайт indikator.one-trading.ru на самом деле в utf-8 кодировке, тогда в чем проблема?

Может в строке $isWinCharset = mb_check_encoding($post, "windows-1251");

прописать несколько кодировок, чтобы угадать нужную, как?

Помогите, пожалуйста.

Спасибо!

Mik Foxi
На сайте с 02.03.2011
Offline
1076
#1

if (mb_detect_encoding($outch) != 'UTF-8') {

$outch = iconv(mb_detect_encoding($outch), "UTF-8", $outch);
}

лучше варианта не придумать.

Антибот, антиспам, веб файрвол, защита от накрутки поведенческих: https://antibot.cloud/ + партнерка, до 40$ с продажи.
S
На сайте с 13.11.2012
Offline
72
#2

foxi, конкретно с сайтом indikator.one-trading.ru

проблема решена!

Но сайты с явно указанной windows-1251 кодировкой слетают в иероглифы :(

У сайтов, где в мета прописана utf-8 кодировка, на самом деле ASCII .

Этот код их обрабатывает и результат корректный:

if (mb_detect_encoding($outch) != 'UTF-8') {
$outch = iconv(mb_detect_encoding($outch), "UTF-8", $outch);
}

На сайтах, где кодировка в мета указана как windows-1251 на самом деле кодировка тоже ASCII и код приведенный выше выводит на таких сайтах иероглифы.

Жуть, как это безобразие можно исправить?

Как-то можно объединить два кода:

if (mb_detect_encoding($outch) != 'UTF-8') {
$outch = iconv(mb_detect_encoding($outch), "UTF-8", $outch);
}

и

$isWinCharset = mb_check_encoding($post, "windows-1251");
if ($isWinCharset) {
$post = iconv("Windows-1251", "UTF-8", $post);
}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий