Подтвердить что ты не робот

Ошибка: "Вход не соответствует UTF-8, укажите кодировку!" используя PHP simplexml_load_string

Я получаю сообщение об ошибке:

parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xED 0x6E 0x2C 0x20

При попытке обработать ответ XML с помощью simplexml_load_string из стороннего источника. Необработанный ответ XML объявляет тип содержимого:

<?xml version="1.0" encoding="UTF-8"?>

Однако, похоже, что XML не является UTF-8. Langauge содержимого XML является испанским и содержит слова типа Dublín в XML.

Я не могу заставить третью сторону разобраться с их XML.

Как я могу предварительно обработать XML и исправить несовместимость кодировки?

Есть ли способ определить правильную кодировку для XML файла?

4b9b3361

Ответ 1

Ваш 0xED 0x6E 0x2C 0x20 байт соответствует "ín" в 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]);
}

Ответ 2

Я решил это, используя

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);

Ответ 3

Если вы уверены, что ваш XML-код закодирован в UTF-8, но содержит плохие символы, вы можете использовать эту функцию для их исправления:

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);

Ответ 4

Вместо использования javascript вы можете просто поместить эту строку кода после предложения mysql_connect:

mysql_set_charset('utf8',$connection);

Приветствия.

Ответ 5

Недавно мы столкнулись с подобной проблемой и не смогли найти ничего очевидного в качестве причины. В нашей строке был управляющий символ, но когда мы вывезли эту строку в браузер, этот символ не был виден, если мы не скопировали текст в среду IDE.

Нам удалось решить нашу проблему благодаря этому сообщению и этому:

preg_replace ('/[\ x00-\x1F\x7F]/', '', $input);

Ответ 6

Если вы загрузите файл XML и откройте его, например, в Notepad ++, вы увидите, что кодировка установлена ​​на что-то еще, чем UTF8. У меня была такая же проблема с xml, что и я, и это было просто te encoding в редакторе:)

String <?xml version="1.0" encoding="UTF-8"?> не настраивать кодировку документа, это только информация для валидатора или другого ресурса.

Ответ 7

Вы можете открыть сторонний источник XML в Firefox и посмотреть, что он автоматически определяет как кодирование? Возможно, они используют простой старый ISO-8859-1, UTF-16 или что-то еще.

Если они заявляют, что это UTF-8, хотя и служат чему-то еще, их фид явно сломан. Работа вокруг такого сломанного корма кажется мне ужасным (хотя иногда это неизбежно, я знаю).

Если это простой пример, например "UTF-8 по сравнению с ISO-8859-1", вы также можете испытать удачу с помощью mb_detect_encoding().

Ответ 8

После нескольких попыток я обнаружил, что функция htmlentities работает.

$value = htmlentities($value)

Ответ 9

При создании файлов сопоставления с использованием доктрины я столкнулся с одной проблемой. Я исправил это, удалив все комментарии, которые некоторые поля имели в базе данных.

Ответ 10

У меня была эта проблема. Оказывается, XML файл (а не содержимое) не был закодирован в utf-8, а в ISO-8859-1. Вы можете проверить это на Mac с помощью file -I xml_filename.

Я использовал Sublime для изменения кодировки файла в utf-8, а lxml не импортировал никаких проблем.