Ваши 0xED 0x6E 0x2C 0x20 байтов соответствуют «in» в ISO-8859-1, поэтому ваш контент выглядит как ISO-8859-1, а не как UTF-8. Сообщите об этом своему поставщику данных и попросите его исправить это, потому что, если он не работает для вас, он, вероятно, не будет работать и для других людей.
Теперь есть несколько способов обойти это, вы должны использовать только , если вы не можете загрузить XML нормально . Одним из них будет использование utf8_encode()
. Недостатком является то, что если этот XML содержит как действительный UTF-8, так и некоторый ISO-8859-1, то результат будет содержать mojibake . Или вы можете попытаться преобразовать строку из UTF-8 в UTF-8, используя iconv()
или mbstring, и надеяться, что они исправят это для вас. (они не будут, но вы можете по крайней мере игнорировать недопустимые символы, чтобы вы могли загрузить свой XML)
Или вы можете пройти длинный, длинный путь и самостоятельно проверить / исправить последовательности. Это займет у вас некоторое время в зависимости от того, насколько вы знакомы с UTF-8. Возможно, есть библиотеки, которые бы это делали, хотя я не знаю ни одной.
В любом случае, сообщите поставщику данных, что он отправляет недействительные данные, чтобы они могли это исправить.
Вот частичное исправление. Это определенно не все исправит, но исправит некоторые из них. Надеюсь, вам удастся обойтись, пока ваш провайдер не починит их.
function fix_latin1_mangled_with_utf8_maybe_hopefully_most_of_the_time($str)
{
return preg_replace_callback('#[\\xA1-\\xFF](?![\\x80-\\xBF]{2,})#', 'utf8_encode_callback', $str);
}
function utf8_encode_callback($m)
{
return utf8_encode($m[0]);
}