Проблема в том, что функция mb_detect_encoding() ошибается. Для строки с битыми символами она возвращает UTF-8, хотя на самом деле исходная кодировка страницы - Windows-1251 (очень распространенная для сайтов с доменом .by).
mb_detect_encoding() не идеален, пытается угадать кодировку по статистическим закономерностям. Для коротких строк или строк с большим количеством бинарных символов он часто ошибается и возвращает UTF-8, даже если это не так.
попробуй это
<?php
$url = 'https://%sitename%.by/...';
$page = file_get_contents($url);
if ($page === false) {
die('Ошибка загрузки страницы.');
}
// Способ 1: Самый надежный — принудительно указать ожидаемую кодировку
// Так как сайт белорусский, велика вероятность Windows-1251
$page_utf8_fixed = iconv('Windows-1251', 'UTF-8//IGNORE', $page);
// Флаг //IGNORE отбрасывает символы, которые невозможно конвертировать, чтобы избежать Notice
echo $page_utf8_fixed;
// Способ 2: Попытка автоопределения с перебором самых частых кодировок
$encodings = ['UTF-8', 'Windows-1251', 'KOI8-R', 'ISO-8859-5'];
$detected_encoding = mb_detect_encoding($page, $encodings, true);
if ($detected_encoding && $detected_encoding !== 'UTF-8') {
$page_utf8_auto = mb_convert_encoding($page, 'UTF-8', $detected_encoding);
echo $page_utf8_auto;
} else {
// Если не удалось определить или это уже UTF-8, но выглядит как кракозябры
echo "Не удалось определить кодировку или кодировка определена неверно.";
}
// Способ 3: Анализ через заголовки HTTP (если сервер их отдает)
$context = stream_context_create(['http' => ['ignore_errors' => true]]);
$headers = get_headers($url, 1, $context);
if (isset($headers['Content-Type']) && strpos($headers['Content-Type'], 'charset=') !== false) {
preg_match('/charset=([a-zA-Z0-9\-]+)/', $headers['Content-Type'], $matches);
if (!empty($matches[1])) {
$header_charset = strtoupper($matches[1]);
$page_from_header = mb_convert_encoding($page, 'UTF-8', $header_charset);
echo $page_from_header;
}
}
?>