У меня была аналогичная проблема, но не удалось заставить 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()
):
«str_replace (« ÿþ »,« », $ trackartist1);' работает? – Carpetsmoker
Нет, это не так. @Carpetsmoker – austinhollis
Можете ли вы предоставить примерную строку данных ID3? str_replace поддерживает многобайтовые строки, и предложение @ Carpetsmoker, похоже, работает: http://codepad.org/Od59V0ki – danronmoon