Я пытаюсь загрузиться, анализируют ответ 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
Проблема здесь в том, что 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);
}
Обновление: Я могу воспроизвести проблему. Кроме того, 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)