Я получаю сообщение об ошибке:
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-файла?
Ваш 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]); }
Я решил это, используя
$content = utf8_encode(file_get_contents('http://example.com/rss.xml')); $xml = simplexml_load_string($content);
Если вы уверены, что ваш XML-код закодирован в UTF-8, но содержит плохие символы, вы можете использовать эту функцию для их исправления:
$content = iconv('UTF-8', 'UTF-8//IGNORE', $content);
Вместо использования javascript вы можете просто поместить эту строку кода после предложения mysql_connect:
mysql_set_charset('utf8',$connection);
Приветствия.
Недавно мы столкнулись с подобной проблемой и не смогли найти ничего очевидного в качестве причины. В нашей строке оказался контрольный символ, но когда мы выводили эту строку в браузер, этот символ не был виден, если мы не скопировали текст в среду IDE.
Благодаря этой должности нам удалось решить эту проблему:
preg_replace ('/ [\ x00- \ x1F \ x7F] /', '', $ input);
Если вы загрузите файл XML и откройте его, например, в Notepad ++, вы увидите, что кодировка установлена на что-то еще, чем UTF8. У меня была такая же проблема с xml, что и я, и это было просто te encoding в редакторе 🙂
Строка <?xml version="1.0" encoding="UTF-8"?>
Не настраивает кодировку документа, это только информация для валидатора или другого ресурса.
Можете ли вы открыть сторонний источник XML в Firefox и посмотреть, что он автоматически определяет как кодирование? Возможно, они используют простой старый ISO-8859-1, UTF-16 или что-то еще.
Если они заявляют, что это UTF-8, и что-то еще, их фид явно сломан. Работа вокруг такого сломанного корма кажется мне ужасным (хотя иногда это неизбежно, я знаю).
Если это простой пример, например «UTF-8 по сравнению с ISO-8859-1», вы также можете попробовать свою удачу с помощью mb_detect_encoding () .
После нескольких попыток я обнаружил, что функция htmlentities работает.
$value = htmlentities($value)
При создании файлов сопоставления с использованием доктрины я столкнулся с одной и той же проблемой. Я исправил это, удалив все комментарии, которые некоторые поля имели в базе данных.
У меня была эта проблема. Оказывается, XML-файл (а не содержимое) не был закодирован в utf-8, а в ISO-8859-1. Вы можете проверить это на Mac с file -I xml_filename
.
Я использовал Sublime для изменения кодировки файла в utf-8, а lxml не импортировал никаких проблем.