Задать вопрос
oOLokiOo
@oOLokiOo
PHP Developer

PHP 8.3 --> универсальная конвертация из любой кодировки в читаемый русский текст — КАК?

$page = '';
$page_utf8 = '';
$page = file_get_contents('https://%sitename%.by/...');

$page_utf8 = iconv(mb_detect_encoding($page, mb_detect_order(), true), "UTF-8", $page);
// Notice: iconv(): Detected an illegal character in input string in ...

echo mb_convert_encoding($page, 'UTF-8', 'auto');
// ??}k?#?u?_?P??9???;??u#?-xeĆ ??"?;M6?ݜ?E@?a?A?^?C???$?~?7Y??RlK@~??ztWU_3??Y?h??f=N?9u?S?NU=??????{? ...

echo mb_detect_encoding($page);
// UTF-8

echo $page;
// F-8��}k�#�u�_�P��9���;��u#�-xeĆ ��"�;M6�ݜ�E@�a�A�^�C���$�~�7Y��RlK@~��ztWU_3��Y�h��f=N�9u�S�NU=������{? ...

В коде той страницы ЯВНО указано - < meta http-equiv="Content-type" content="text/html; charset=utf-8" >
в своём Sublime я ЯВНО делаю - Save with encoding > UTF-8.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title></title>
</head>
<body style="margin: 25px;">
   <?php /* тут PHP код выше */ ?>
</body>
</html>

Что не так?
  • Вопрос задан
  • 217 просмотров
Подписаться 1 Простой 8 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Skillbox
    Профессия PHP-разработчик с нуля до PRO
    7 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
Проблема в том, что функция 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;
    }
}
?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы