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

Я получаю ошибку:

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-файла?

59
задан Camsoft 24 March 2010 в 12:35
поделиться

2 ответа

Ваши байты 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]);
}
75
ответ дан 24 November 2019 в 18:09
поделиться

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

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

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

2
ответ дан 24 November 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: