Я пытаюсь прочитать данные ID3 навалом. На некоторых дорожках появляется ÿþ. Я могу удалить первые 2 символа, но это повредит трекам, у которых его нет.
Вот что у меня сейчас есть:
$trackartist=str_replace("\0", "", $trackartist1);
Любые предложения будут благодарны, спасибо!
ÿþ
0xfffe в UTF-8; это знак порядка байтов в UTF-16.
Вы можете конвертировать вашу строку в UTF-8 с iconv
или же mb_convert_encoding()
:
$trackartist1 = iconv('UTF-16LE', 'UTF-8', $trackartist1);
# Same as above, but different extension
$trackartist1 = mb_convert_encoding($trackartist1, 'UTF-16LE', 'UTF-8');
# str_replace() should now work
$trackartist1 = str_replace('ÿþ', '', $trackartist1);
Это предполагает $trackartist1
всегда в UTF-16LE; обратитесь к документации вашей библиотеки тегов ID3, чтобы узнать, как получить кодировку тегов, поскольку она может отличаться для разных файлов. Обычно вы хотите конвертировать все в UTF-8, так как это то, что PHP использует по умолчанию.
У меня была похожая проблема, но я не смог заставить UTF-16LE
так как входная кодировка может измениться. Наконец-то я обнаружить UTF-8
следующее:
if (!preg_match('~~u', $html)) {
Для случая, когда это не удается, я получить правильную кодировку через спецификацию:
function detect_bom_encoding($str) {
if ($str[0] == chr(0xEF) && $str[1] == chr(0xBB) && $str[2] == chr(0xBF)) {
return 'UTF-8';
}
else if ($str[0] == chr(0x00) && $str[1] == chr(0x00) && $str[2] == chr(0xFE) && $str[3] == chr(0xFF)) {
return 'UTF-32BE';
}
else if ($str[0] == chr(0xFF) && $str[1] == chr(0xFE)) {
if ($str[2] == chr(0x00) && $str[3] == chr(0x00)) {
return 'UTF-32LE';
}
return 'UTF-16LE';
}
else if ($str[0] == chr(0xFE) && $str[1] == chr(0xFF)) {
return 'UTF-16BE';
}
}
И теперь я могу использовать iconv()
как вы можете видеть в @carpetsmoker ответ:
iconv(detect_bom_encoding($html), 'UTF-8', $html);
Я не пользовалась mb_convert_encoding()
поскольку это не удаляло спецификацию (и не преобразовывало переносы строк как iconv()
делает):
Используйте замену регулярного выражения:
$trackartist1 = preg_replace("/\x00?/", "", $trackartist1);
Приведенное выше регулярное выражение ищет первое вхождение «\ x00» (шестнадцатеричные нули), если это возможно, и заменяет его ничем.