За последние 24 часа нас посетил 21441 программист и 1016 роботов. Сейчас ищут 654 программиста ...

Id3 теги в latin1. Кракозябры

Тема в разделе "PHP для новичков", создана пользователем Sominemo, 23 дек 2017.

Метки:
  1. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    Привет!

    Коротко:
    Есть база треков *.mp3
    Нужно вытянуть названия из мета-тегов
    Треки прогоняются через ID3() ( http://www.getid3.org/ )
    Большая часть треков обрабатывается на ура
    [ПРОБЛЕМА] Но другая часть возвращается в формате &#***; вместо кириллических символов.
    Пример:
    Код (Text):
    1. [muzmo.ru] Юлианна Караулова
    [Попытка решить проблему] Прогоняю через html_entity_decode(). Получаю кракозябры как тут:
    Код (Text):
    1. Ñâîáîäà (feat. Êèïåëîâ)
    Нарыл, что это называется latin1. В общем, баловался с параметрами html_entity_decode, разными конвертациями, но все безуспешно. Хотя вот различные HTML-entinials конверторы нормально конвертируют, а декодер Лебедева может расшифровать кракозябры.
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    У меня на локалке (где все заточено под utf-8) код
    PHP:
    1. $str = 'Юлианна Караулова';
    2. $str = html_entity_decode($str);
    3. echo $str;
    возвращает "Юлианна Караулова".
    Функция html_entity_decode() на наличие/отсутствие последнего параметра реагирует в зависимости от версии php.
     
  3. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    php 5.4. Такого чуда не происходит. Как в бд, так и на страницу выводятся кракозябры.
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Sominemo, уточните, в какой кодировке исходные файлы проекта, что записано в phpinfo() о default_charset, что записано в <meta charset=...>, какие передаются (если передаются) header('Content-type: text/html; charset=..., какая кодировка устанавливается после соединения с базой (set names=..., или иное что...), какова кодировка схемы (базы) данных, таблицы...
    ?
     
  5. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    default_charset = utf-8
    передаю utf-8 метатег
    К бд подключаюсь по utf8mb4
    --- Добавлено ---
    Сопоставление бд и таблицы utf8...
     
  6. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Sominemo, пишете в базу html-сущности как есть, или предварительно обрабатываете?
     
  7. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    Не бейте за использование mysql, так уж изначально писался движок)

    PHP:
    1. $tags_data = getTags(HOME.'/files/audio/'.$audio[1].'/'.$audio[5]); // &#***;, которые при непосредственном выводе дают такие же кракозябры как и html_entity_decode()
    2.     if (!empty($tags_data[0][0]) && !empty($tags_data[1][0])) {
    3.     $title = html_entity_decode($tags_data[0][0],ENT_HTML5, 'UTF-8'); // Кракозябры
    4.     $artist = html_entity_decode($tags_data[1][0],ENT_HTML5, 'UTF-8');
    5.  
    6.     }
    7.         $title = mysql_real_escape_string($title);
    8.         $artist = mysql_real_escape_string($artist);
    9.         mysql_query("UPDATE `audio` SET `artist` = '$artist', `name` = '$title' WHERE `id` = $audio[0]");
     
  8. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    Может ли быть причина в mysql_real_escape_string?
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Если сразу после получения getTags выводится не читабельно, то база данных ни при чём.
    var_dump($tags_data); для проблемного случая что показывает?
     
  10. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    upload_2017-12-24_21-28-38.png
     
  11. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Sominemo, а если попросить браузер показать страницу в других кодировках?
     
  12. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    Firefox заморозил меню выбора кодировки
     
  13. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    Поигрался с encoding-ом через расширение в хроме. Кракозябры.
     
  14. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Sominemo, как getTags() обращается с данными, полученными от расширения getID3?
     
  15. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    PHP:
    1. function getTags($file) {
    2.     $getID3 = new getID3;
    3.     $getID3->setOption(array('encoding' => 'UTF-8'));
    4.     $ThisFileInfo = $getID3->analyze($file);
    5.     getid3_lib::CopyTagsToComments($ThisFileInfo);
    6.     return [$ThisFileInfo['comments_html']['title'], $ThisFileInfo['comments_html']['artist'], $ThisFileInfo['comments_html']['album']];
    7. }
     
  16. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Sominemo, давай вернемся к началу.
    Что выведет код
    PHP:
    1. header('Content-Type: text/html; charset=utf-8');
    2. $str = '&#1070;&#1083;&#1080;&#1072;&#1085;&#1085;&#1072; &#1050;&#1072;&#1088;&#1072;&#1091;&#1083;&#1086;&#1074;&#1072;';
    3. echo $str;
    ,
    если его добавить до или после использования функции getTags?
    --- Добавлено ---
    Или раньше 1-ю строчку (header) разместить... если есть вывод клиенту в браузер...
     
  17. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    Код:

    PHP:
    1. header('Content-Type: text/html; charset=utf-8');
    2. $str = '&#1070;&#1083;&#1080;&#1072;&#1085;&#1085;&#1072; &#1050;&#1072;&#1088;&#1072;&#1091;&#1083;&#1086;&#1074;&#1072;<br>';
    3. echo $str;
    4.  
    5. while ($audio = mysql_fetch_array($r)) {
    6.     $tags_data = getTags(HOME.'/files/audio/'.$audio[1].'/'.$audio[5]);
    7.     if (!empty($tags_data[0][0]) && !empty($tags_data[1][0])) {
    8.     var_dump($tags_data);
    9.     echo '<br>';
    10.     }
    11.         $title = mysql_real_escape_string($title);
    12.         $artist = mysql_real_escape_string($artist);
    13.     }
    14.  
    15.  
    16.     $str = '&#1070;&#1083;&#1080;&#1072;&#1085;&#1085;&#1072; &#1050;&#1072;&#1088;&#1072;&#1091;&#1083;&#1086;&#1074;&#1072;';
    17.     echo $str;
    Вывод:

    Код (Text):
    1. Юлианна Караулова
    2. array(3) { [0]=> array(1) { [0]=> string(26) "boombox / peace to hip-hop" } [1]=> array(1) { [0]=> string(7) "boombox" } [2]=> array(1) { [0]=> string(15) "family busyness" } }
    3. array(3) { [0]=> array(1) { [0]=> string(37) "Ñâîáîäà (feat. Êèïåëîâ)" } [1]=> array(1) { [0]=> string(73) "Ñåðãåé Øíóðîâ" } [2]=> array(1) { [0]=> string(68) "Ëþáîâü è áîëü" } }
    4. array(3) { [0]=> array(1) { [0]=> string(11) "21 Грам" } [1]=> array(1) { [0]=> string(86) "Сонце В Кишені" } [2]=> array(1) { [0]=> string(10) "Zaycev.Net" } }
    5. Юлианна Караулова
    --- Добавлено ---
    Если убрать header вывод не меняется
     
  18. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
  19. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    upload_2017-12-25_12-50-55.png
    --- Добавлено ---
    Вот еще к второму выводу Карауловой добавил
    upload_2017-12-25_12-51-32.png
     
  20. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Sominemo, о $tags_data[0][0], $tags_data[1][0] и $tags_data[2][0]
     
  21. Sominemo

    Sominemo Новичок

    С нами с:
    24 май 2016
    Сообщения:
    29
    Симпатии:
    0
    Искренне благодарен Вам за помощь! Мне удалось декодировать строку подобным способом (метод подбора :D кодировок)
    PHP:
    1. $tags_data[0][0] = iconv('utf-8', 'iso-8859-15', $tags_data[0][0]);
    2. $tags_data[0][0] = iconv('cp1251', 'utf-8', $tags_data[0][0]);