Simplexml_load_string () перестали работать к ошибке анализа

Я пытаюсь загрузиться, анализируют ответ Google Weather API (китайский ответ).

Вот вызов API.

// This code fails with the following error
$xml = simplexml_load_file('http://www.google.com/ig/api?weather=11791&hl=zh-CN');

(!) Предупреждение: simplexml_load_string () [function.simplexml-строка-загрузки]: Объект: строка 1: ошибка синтаксического анализатора: Вход не является надлежащим UTF-8, укажите на кодирование! Байты: 0xB6 0xE0 0xD4 0xC6 в C:\htdocs\weather.php на строке 11

Почему делает загрузку этого сбоя ответа?

Как я кодирую/декодирую ответ так, чтобы simplexml загрузки это правильно?

Править: Вот код и вывод.

(!) Предупреждение: simplexml_load_string () [function.simplexml-строка-загрузки]: Объект: строка 1: ошибка синтаксического анализатора: Вход не является надлежащим UTF-8, укажите на кодирование! Байты: 0xB6 0xE0 0xD4 0xC6 в C:\htdocs\test4.php на строке 3 Местоположения Функции Памяти Времени Стека вызовов 1 0.0020 314 264 {основного} ()..\test4.php:0 2 0.1535 317 520 simplexml_load_string (строка (1364))..\test4.php:3

(!) Предупреждение: simplexml_load_string () [function.simplexml-строка-загрузки]: данные t_system = "SI"/>

(!) Предупреждение: simplexml_load_string () [function.simplexml-строка-загрузки]: ^ в C:\htdocs\test4.php на строке 3 Местоположения Функции Памяти Времени Стека вызовов 1 0.0020 314 264 {основного} ()..\test4.php:0 2 0.1535 317 520 simplexml_load_string (строка (1364))..\test4.php:3

8
задан nyedidikeke 15 January 2017 в 23:24
поделиться

2 ответа

Проблема здесь в том, что SimpleXML не смотрит на заголовок HTTP, чтобы определить кодировку символов, используемую в документе, и просто предполагает, что это UTF-8, хотя сервер Google рекламирует его как

Content-Type: text/xml; charset=GB2312

Вы можете написать функцию, которая будет смотреть на этот заголовок с помощью супер-секретная магическая переменная $http_response_header и соответствующим образом преобразовать ответ. Что-то вроде этого:

function sxe($url)
{   
    $xml = file_get_contents($url);
    foreach ($http_response_header as $header)
    {   
        if (preg_match('#^Content-Type: text/xml; charset=(.*)#i', $header, $m))
        {   
            switch (strtolower($m[1]))
            {   
                case 'utf-8':
                    // do nothing
                    break;

                case 'iso-8859-1':
                    $xml = utf8_encode($xml);
                    break;

                default:
                    $xml = iconv($m[1], 'utf-8', $xml);
            }
            break;
        }
    }

    return simplexml_load_string($xml);
}
21
ответ дан 5 December 2019 в 05:25
поделиться

Обновление: Я могу воспроизвести проблему. Кроме того, Firefox автоматически обнюхивает набор символов как «упрощенный китайский», когда я выводю необработанный канал XML. Либо канал Google обслуживает неверные данные (символы упрощенного китайского языка вместо символов UTF-8), либо обслуживает другие данные, когда они не загружены в браузере - в заголовке типа содержимого в Firefox четко указано utf-8 .

Преобразование входящей ленты из упрощенного китайского (GB18030, это то, что мне дал Firefox) в UTF-8 работает:

 $incoming = file_get_contents('http://www.google.com/ig/api?weather=11791&hl=zh-CN');
 $xml = iconv("GB18030", "utf-8", $incoming);
 $xml = simplexml_load_string($xml);

это еще не объясняет и не устраняет основную проблему. У меня сейчас нет времени вдаваться в подробности, может быть, кто-то еще. Мне кажется, что Google на самом деле предоставляет неверные данные (что меня удивило бы. Я не знал, что они совершали ошибки, как и мы, смертные.: P)

5
ответ дан 5 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

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