2014-10-21 3 views
1

Я пытаюсь читать данные ID3 навалом. На некоторых дорожках появляется.. Я могу удалить первые 2 символа, но это вредит трекам, которые его не имеют.Удалить ÿþ из строки

Это то, что я в настоящее время:

$trackartist=str_replace("\0", "", $trackartist1); 

Любые предложения будут благодарны, спасибо!

+4

«str_replace (« ÿþ »,« », $ trackartist1);' работает? – Carpetsmoker

+0

Нет, это не так. @Carpetsmoker – austinhollis

+2

Можете ли вы предоставить примерную строку данных ID3? str_replace поддерживает многобайтовые строки, и предложение @ Carpetsmoker, похоже, работает: http://codepad.org/Od59V0ki – danronmoon

ответ

4

ÿþ 0xfffe в UTF-8; это byte order mark в 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 по умолчанию.

+0

Когда я использую '$ trackartist1 = iconv ('UTF-8', 'UTF-16', $ trackartist1);' и 'str_replace ('ÿþ', '', $ trackartist1);' затем он переключается на þÿ на начало – austinhollis

0

Использование замены регулярных выражений:

$trackartist1 = preg_replace("/\x00?/", "", $trackartist1); 

Регулярное выражение выше ищет первое вхождение «\ x00» (шестнадцатеричные нули), если это возможно, и заменяет его ни с чем.

+0

Я не понимаю, как это решает проблему? – Carpetsmoker

+0

@Carpetsmoker мое плохое! Я думал, что он хочет получить символы '\ 0', как указано в его коде. Я не заметил '\ xfffe'. – Cunning

1

У меня была аналогичная проблема, но не удалось заставить UTF-16LE, так как входной набор символов мог измениться. Наконец-то я detect UTF-8 следующим образом:

if (!preg_match('~~u', $html)) { 

Для случая, когда это не удается, я obtain the correct encoding through the BOM:

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 answer:

iconv(detect_bom_encoding($html), 'UTF-8', $html); 

Я не использовал mb_convert_encoding(), так как он не удалял спецификацию (и не преобразовывал разрывы строк как iconv()):
enter image description here

Смежные вопросы