Удалить ÿþ из строки

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

Вот что у меня сейчас есть:

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

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

3

Решение

ÿþ 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 использует по умолчанию.

8

Другие решения

У меня была похожая проблема, но я не смог заставить 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() делает):
введите описание изображения здесь

1

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

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

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

0
По вопросам рекламы [email protected]