Ошибка: «Неправильный ввод UTF-8, укажите кодировку!»используя PHP Simplexml_load_string - PullRequest
57 голосов
/ 24 марта 2010

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

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. Язык XML-контента - испанский и содержит такие слова, как Dublín в XML.

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

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

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

Ответы [ 10 ]

72 голосов
/ 24 марта 2010

Ваши 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]);
}
46 голосов
/ 02 января 2011

Я решил это с помощью

$content = utf8_encode(file_get_contents('http://example.com/rss.xml'));
$xml = simplexml_load_string($content);
13 голосов
/ 02 декабря 2013

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

$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
4 голосов
/ 11 ноября 2016

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

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

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

3 голосов
/ 03 апреля 2011

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

mysql_set_charset('utf8',$connection);

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

2 голосов
/ 30 января 2011

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

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

2 голосов
/ 24 марта 2010

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

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

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

1 голос
/ 22 июля 2016

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

$value = htmlentities($value)
0 голосов
/ 09 июня 2016

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

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

0 голосов
/ 03 июня 2016

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

...