Преобразование данных XML в ISO-8859-1 для данных POST вызовов API

У меня есть XML-данные, которые я использую для публикации в API idibu (API доски объявлений в Великобритании). Я сделал успешный вызов с их тестовыми данными POST. Вот:

xml_text=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Cidibu%3E%0D%0A%3Cmethod%3Eadd%3C%2Fmethod%3E%0D%0A%3Cconfig%3E%0D%0A%3Cshow_durations%3Eno%3C%2Fshow_durations%3E%0D%0A%3Ccompletionurl%3Eemail%3C%2Fcompletionurl%3E%0D%0A%3Cadvertcompletionemail%3Ebob%40bob.com%3C%2Fadvertcompletionemail%3E%0D%0A%3Clockboards%3Eyes%3C%2Flockboards%3E%0D%0A%3Credirecturl%3Ehttp%3A%2F%2Fwww.google.com+%3C%2Fredirecturl%3E%0D%0A%3Cvalidate_level%3Ewarning%3C%2Fvalidate_level%3E%0D%0A%3C%2Fconfig%3E%0D%0A%3Cjob%3E%0D%0A%3Ctitle%3E%3C%21%5BCDATA%5BXML+v+3+test%2C+please+ignore+Special+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+-+%3A+%3B+_+%2B+%27+%22+%80%5D%5D%3E%3C%2Ftitle%3E%0D%0A%3Creference%3EABC123456789%3C%2Freference%3E%0D%0A%3Cdescription%3E%3C%21%5BCDATA%5B%3Cb%3ESpecial+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+here+euro+%80+%0D%0ABasic+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0ASpecial+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0A%0D%0A+%0D%0A+Special+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0ABasic+Te+%A3+%24+%26+%25+%40+%21+%3F+.+%2C+%3D+%29+%28+%2F+-+%3A+%3B+_+%2B+%27+%22+%27+%80+%0D%0A%0D%0A+%96+%96+%92+%27+%95+++++++%2C+%09%2C+%95+%B7+%93+%94+%D8+%85+%A8+%A6+%27+%3A+%27+%83+%E1+%91+%BA+%A1+%A7+%E9+%D7+%87+%27+%3A+%27+%27+%C7+%BD+%84+h+%AE+%97+%AC+%83+%E1+%99%3C%2Fb%3E%5D%5D%3E%3C%2Fdescription%3E%0D%0A%3Csender%3E%0D%0A%3Cname%3ESteve%3C%2Fname%3E%0D%0A%3Clastname%3ERogers%3C%2Flastname%3E%0D%0A%3Cemail%3Etest%40mail.net%3C%2Femail%3E%0D%0A%3Ccompany%3EOne+World+Market%3C%2Fcompany%3E%0D%0A%3Cphone%3E44+%280%29+111-1111111%3C%2Fphone%3E%0D%0A%3Cwww%3Ehttp%3A%2F%2Fuk.idibu.com+%3C%2Fwww%3E%0D%0A%3Ccountry%3EUK%3C%2Fcountry%3E%0D%0A%3Cpostcode%3E020+1111+1111%3C%2Fpostcode%3E%0D%0A%3C%2Fsender%3E%0D%0A%3Ccategory+id%3D%2221%22+%2F%3E%0D%0A%3Clocation+id%3D%228%22+%2F%3E%0D%0A%3Csublocation+id%3D%22668%22+%2F%3E%0D%0A%3Cjobtype+id%3D%222%22+%2F%3E%0D%0A%3Cjob_time%3E2%3C%2Fjob_time%3E%0D%0A%3Cstartdate%3E2011-11-26%3C%2Fstartdate%3E%0D%0A%3Cduration%3EFull+time%3C%2Fduration%3E%0D%0A%3Csalarymin%3E20000%3C%2Fsalarymin%3E%0D%0A%3Csalarymax%3E25000%3C%2Fsalarymax%3E%0D%0A%3Csalaryper+value%3D%22annum%22+%2F%3E%0D%0A%3CsalaryOverride%3ESalary+override+test+test%3C%2FsalaryOverride%3E%0D%0A%3Ccurrency%3EGBP%3C%2Fcurrency%3E%0D%0A%3Cpublish%3E2011-11-26%3C%2Fpublish%3E%0D%0A%3Cposts%3E%0D%0A%3Cboard+id%3D%22517%22%3E%0D%0A%3Cextrafield+name%3D%22idibudts_cat%22%3E3%3C%2Fextrafield%3E%0D%0A%3Cduration+days%3D%227%22+%2F%3E%0D%0A%3C%2Fboard%3E%0D%0A%3C%2Fposts%3E%0D%0A%3C%2Fjob%3E%0D%0A%3C%2Fidibu%3E

Я смог декодировать это в стандартный формат XML здесь: http://coderstoolbox.net/string/#!encoding=url&action=decode&charset=us_ascii (вставьте информацию в верхнее поле). Ниже то, что я получаю:

xml_text=<?xml version='1.0' encoding='UTF-8'?>
<idibu>
<method>add</method>
<config>
<show_durations>no</show_durations>
<completionurl>email</completionurl>
<advertcompletionemail>[email protected]</advertcompletionemail>
<lockboards>yes</lockboards>
<redirecturl>http://www.google.com </redirecturl>
<validate_level>warning</validate_level>
</config>
<job>
<title><![CDATA[XML v 3 test, please ignore Special £ $ & % @ ! ? . , = ) ( - : ; _ + ' ' ]]></title>
<reference>ABC123456789</reference>
<description><![CDATA[<b>Special Te £ $ & % @ ! ? . , = ) ( / - : ; _ + ' ' ' here euro  
Basic Te £ $ & % @ ! ? . , = ) ( / - : ; _ + ' ' '  
Special Te £ $ & % @ ! ? . , = ) ( / - : ; _ + ' ' '  
Special Te £ $ & % @ ! ? . , = ) ( / - : ; _ + ' ' '  
Basic Te £ $ & % @ ! ? . , = ) ( / - : ; _ + ' ' '  '        ,    ,  ·   Ø  ¨ ¦ ' : '  á  º ¡ § é ×  ' : ' ' Ç ½  h ®  ¬  á </b>]]>        
</description>
<sender>
<name>Steve</name>
<lastname>Rogers</lastname>
<email>[email protected]</email>
<company>One World Market</company>
<phone>44 (0) 111-1111111</phone>
<www>http://uk.idibu.com </www>
<country>UK</country>
<postcode>020 1111 1111</postcode>
</sender>
<category id='21' />
<location id='8' />
<sublocation id='668' />
<jobtype id='2' />
<job_time>2</job_time>
<startdate>2011-11-26</startdate>
<duration>Full time</duration>
<salarymin>20000</salarymin>
<salarymax>25000</salarymax>
<salaryper value='annum' />
<salaryOverride>Salary override test test</salaryOverride>
<currency>GBP</currency>
<publish>2011-11-26</publish>
<posts>
<board id='517'>
<extrafield name='idibudts_cat'>3</extrafield>
<duration days='7' />
</board>
</posts>
</job>
</idibu>

Для простоты я настраиваю данные API в последнем из двух форматов (стандартный XML). Например, для рекламного сообщения электронной почты будет:

echo "<advertcompletionemail>".$advert_email."</advertcompletionemail>";

Однако информация должна быть закодирована, чтобы в конечном итоге отправить ее в API после того, как я закончу ее настройку. В документации idibu говорится, что она должна быть закодирована как iso-8859-1, и я предполагаю, что это первый блок кода. Я попытался установить все данные XML в виде строки ($str), а затем запустить:

echo "htmlentities($str)";

OR

echo "htmlentities($str, ENT_QUOTE, ISO-8859-1);

Но ни то, ни другое не работает. Я также попробовал utf8_decode($str) (и utf8_encode($str) хотя был почти уверен, что это не та функция), и это не сработало. Может ли кто-нибудь помочь мне понять, как закодировать этот XML в правильный формат? Спасибо за вашу помощь!


person MillerMedia    schedule 07.08.2013    source источник
comment
ISO-8859-1 не UTF8. Тем не менее, я думаю, маловероятно, что вам вообще нужно выполнять какое-либо ручное кодирование текстовых данных. Если вызов API не работает, это, скорее всего, связано с какой-то другой проблемой.   -  person aroth    schedule 08.08.2013


Ответы (1)


Я бы использовал iconv Вы можете прочитать об этом в руководстве здесь: http://php.net/manual/en/book.iconv.php

Если вы точно знаете, что изначально это UTF-8, вы можете запустить эту функцию: http://www.php.net/manual/en/function.iconv.php

iconv("UTF-8", "ISO-8859-1", $xml)

И отправьте это в API. Странно, что API выдает UTF-8, но требует ISO-8859-1. Хотя, возможно, я что-то неправильно понимаю.

person George Yates    schedule 07.08.2013