Привет! Коротко: Есть база треков *.mp3 Нужно вытянуть названия из мета-тегов Треки прогоняются через ID3() ( http://www.getid3.org/ ) Большая часть треков обрабатывается на ура [ПРОБЛЕМА] Но другая часть возвращается в формате &#***; вместо кириллических символов. Пример: Код (Text): [muzmo.ru] Юлианна Караулова [Попытка решить проблему] Прогоняю через html_entity_decode(). Получаю кракозябры как тут: Код (Text): Ñâîáîäà (feat. Êèïåëîâ) Нарыл, что это называется latin1. В общем, баловался с параметрами html_entity_decode, разными конвертациями, но все безуспешно. Хотя вот различные HTML-entinials конверторы нормально конвертируют, а декодер Лебедева может расшифровать кракозябры.
У меня на локалке (где все заточено под utf-8) код PHP: $str = 'Юлианна Караулова'; $str = html_entity_decode($str); echo $str; возвращает "Юлианна Караулова". Функция html_entity_decode() на наличие/отсутствие последнего параметра реагирует в зависимости от версии php.
@Sominemo, уточните, в какой кодировке исходные файлы проекта, что записано в phpinfo() о default_charset, что записано в <meta charset=...>, какие передаются (если передаются) header('Content-type: text/html; charset=..., какая кодировка устанавливается после соединения с базой (set names=..., или иное что...), какова кодировка схемы (базы) данных, таблицы... ?
default_charset = utf-8 передаю utf-8 метатег К бд подключаюсь по utf8mb4 --- Добавлено --- Сопоставление бд и таблицы utf8...
Не бейте за использование mysql, так уж изначально писался движок) PHP: $tags_data = getTags(HOME.'/files/audio/'.$audio[1].'/'.$audio[5]); // &#***;, которые при непосредственном выводе дают такие же кракозябры как и html_entity_decode() if (!empty($tags_data[0][0]) && !empty($tags_data[1][0])) { $title = html_entity_decode($tags_data[0][0],ENT_HTML5, 'UTF-8'); // Кракозябры $artist = html_entity_decode($tags_data[1][0],ENT_HTML5, 'UTF-8'); } $title = mysql_real_escape_string($title); $artist = mysql_real_escape_string($artist); mysql_query("UPDATE `audio` SET `artist` = '$artist', `name` = '$title' WHERE `id` = $audio[0]");
Если сразу после получения getTags выводится не читабельно, то база данных ни при чём. var_dump($tags_data); для проблемного случая что показывает?
PHP: function getTags($file) { $getID3 = new getID3; $getID3->setOption(array('encoding' => 'UTF-8')); $ThisFileInfo = $getID3->analyze($file); getid3_lib::CopyTagsToComments($ThisFileInfo); return [$ThisFileInfo['comments_html']['title'], $ThisFileInfo['comments_html']['artist'], $ThisFileInfo['comments_html']['album']]; }
@Sominemo, давай вернемся к началу. Что выведет код PHP: header('Content-Type: text/html; charset=utf-8'); $str = 'Юлианна Караулова'; echo $str; , если его добавить до или после использования функции getTags? --- Добавлено --- Или раньше 1-ю строчку (header) разместить... если есть вывод клиенту в браузер...
Код: PHP: header('Content-Type: text/html; charset=utf-8'); $str = 'Юлианна Караулова<br>'; echo $str; while ($audio = mysql_fetch_array($r)) { $tags_data = getTags(HOME.'/files/audio/'.$audio[1].'/'.$audio[5]); if (!empty($tags_data[0][0]) && !empty($tags_data[1][0])) { var_dump($tags_data); echo '<br>'; } $title = mysql_real_escape_string($title); $artist = mysql_real_escape_string($artist); } $str = 'Юлианна Караулова'; echo $str; Вывод: Код (Text): Юлианна Караулова 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" } } array(3) { [0]=> array(1) { [0]=> string(37) "Ñâîáîäà (feat. Êèïåëîâ)" } [1]=> array(1) { [0]=> string(73) "Ñåðãåé Øíóðîâ" } [2]=> array(1) { [0]=> string(68) "Ëþáîâü è áîëü" } } array(3) { [0]=> array(1) { [0]=> string(11) "21 Грам" } [1]=> array(1) { [0]=> string(86) "Сонце В Кишені" } [2]=> array(1) { [0]=> string(10) "Zaycev.Net" } } Юлианна Караулова --- Добавлено --- Если убрать header вывод не меняется
Искренне благодарен Вам за помощь! Мне удалось декодировать строку подобным способом (метод подбора кодировок) PHP: $tags_data[0][0] = iconv('utf-8', 'iso-8859-15', $tags_data[0][0]); $tags_data[0][0] = iconv('cp1251', 'utf-8', $tags_data[0][0]);