Iconv, опубликованные данные и simpleXML - PullRequest
1 голос
/ 14 сентября 2011

Так что я использую simplexml_load_string в некоторых опубликованных XML. Однако я получаю ошибку ниже.

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 8: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xA3 0x37 0x30 0x30 in map_view.php on line 7

Страница закодирована в UTF8. Я думаю, что это может быть знак фунта? Я бы iconv не знал текущую кодировку.

<?xml version="1.0" encoding="utf-8"?>
<documentContent>
  <property>
    <pic1 hiresURL="http://dmqa.briefyourmarket.com/management/house-sample.jpg" imgpath="http://dmqa.briefyourmarket.com/management/house-sample.jpg" />
    <postCode>de560db</postCode>
    <address>Chilly Road, Bingley, Oxon, OX17</address>
    <postcode>OX17 2HE</postcode>
    <price>£700,000</price>
  </property>
</documentContent>

Ответы [ 4 ]

2 голосов
/ 14 сентября 2011

Знак фунта - 0xC2 0xA3 в UTF-8; байты, указанные в сообщении об ошибке, являются символами ISO-8859-1: £ 7 0 0 , поэтому я думаю, что ваш документ на самом деле кодируется как ISO-8859-1, несмотря на декларацию, которая указывает UTF-8.

1 голос
/ 14 сентября 2011

Вы уверены, что файл в кодировке UTF-8?0xA3 - это байт, используемый для кодирования символа £ в ISO-8859-1.£ должно быть 0xC2 0xA3 в кодировке UTF-8.

1 голос
/ 14 сентября 2011

Глядя на байты, я подозреваю, что в действительности используется кодировка ISO-8859-1, иначе Латинская-1.Это должно исправить это:

iconv('ISO-8859-1' ,'UTF-8', $xml)
0 голосов
/ 20 марта 2015

Вам нужно конвертировать документ в UTF-8, проще всего будет использовать utf8_encode ($ data) .

Например:

$xmlInput = simplexml_load_string (utf8_encode(file_get_contents($file)));

Если вы не знаете текущую кодировку, используйте mb_detect_encoding () , например ::

$content = utf8_encode(file_get_contents($url_or_file));
$encoding = mb_detect_encoding($content);
$doc = new DOMdocument();
$res = $doc->loadXML("<?xml encoding='$encoding'>" . $content);

При использовании DOMDocument оно должно выглядеть следующим образом:

$td->nodeValue = utf8_encode("&pound;");
...