Ошибка чтения XML из-за плохой кодировки UTF8 - PullRequest
0 голосов
/ 06 мая 2011

Я пытаюсь создать скрипт для экспорта моих комментариев в Disqus, и для этого мне нужно создать огромный XML-файл.

У меня проблема с кодировкой в ​​UTF 8.Предполагается, что файл находится в UTF-8, но мне нужно сделать utf8_decode для правильного отображения моих испанских элементов.

Сгенерированный файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:dsq="http://www.disqus.com/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:wp="http://wordpress.org/export/1.0/"
>
<channel>
    <wp:comment>
        <wp:comment_id>26</wp:comment_id>
        <wp:comment_author>KA_DIE</wp:comment_author>
        <wp:comment_author_email> </wp:comment_author_email>
        <wp:comment_author_url></wp:comment_author_url>
        <wp:comment_author_IP> </wp:comment_author_IP>
        <wp:comment_date_gmt>2009-07-16 18:53:19</wp:comment_date_gmt>
        <wp:comment_content><![CDATA[WTF TEH Gladios en español <br />tnx tnx <br />me usta mucho esa web estoy pendiente mucho se su actualziacion es buen saber ke esta en español <br />x que solo entendia el 80, 90% de la paguina jiji]]></wp:comment_content>
        <wp:comment_approved>1</wp:comment_approved>
        <wp:comment_parent>0</wp:comment_parent>
    </wp:comment>
</channel>
</rss>

Удаленные данныепо соображениям безопасности, таким как IP или электронная почта.Как видите, он содержит букву «-».Но показанный XML выдает ошибку:

Ошибка чтения XML: плохо составлено

Я не знаю точного перевода, но происходит сбой в строке содержимого.Код сгенерирован следующим образом:

public function generateXmlElement (){
            $xml = "<wp:comment>
                        <wp:comment_id>$this->id</wp:comment_id>
                        <wp:comment_author>$this->author</wp:comment_author>
                        <wp:comment_author_email>$this->author_email</wp:comment_author_email>
                        <wp:comment_author_url>$this->author_url</wp:comment_author_url>
                        <wp:comment_author_IP>$this->author_ip</wp:comment_author_IP>
                        <wp:comment_date_gmt>$this->date</wp:comment_date_gmt>
                        <wp:comment_content><![CDATA[$this->content]]></wp:comment_content>
                        <wp:comment_approved>$this->approved</wp:comment_approved>
                        <wp:comment_parent>0</wp:comment_parent>
            </wp:comment>";
            return $xml;
        }

И затем запишите файл.

Знаете ли вы, в чем должна быть проблема?

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Скорее всего, проблема в том, что ваш XML не кодирован в UTF-8, а на самом деле является чем-то другим (ISO-8859-1?).Символ 'ñ' (U + 00F1) кодируется в UTF-8 как 2 октета 0xC3B1.И в кодовой странице Windows 1252, и в кодировках ISO-8859 'ñ' представляет собой один октет 0xF1.

Имеет ли ваш XML-файл Unicode BOM (U + FEFF) в начале файла?Спецификация, если имеется, указывает кодировку и порядок байтов.

  • 0xEFBBBF: UTF-8.Порядок байтов не имеет значения.
  • Порядок байтов имеет значение для UTF-16 и UTF-32:
    • 0xFFFE: UTF-16, little-endian
    • 0xFEFF: (big-endian)
    • 0xFFFE0000: UTF-32, little-endian
    • 0x0000FEFF: UTF-32, big-endian

Стандарт XML гласит, что если нет спецификаций и нет декларации XML, указывающей кодировку, то этот документ должен интерпретироваться как кодировка UTF-8 по умолчанию.Я полагаю, что неясно, что произойдет, если они представляют собой несоответствие между спецификацией (если присутствует) и кодировкой, указанной в объявлении XML.

Возможно, ваш файл имеет неправильное объявление XML (например, вместоговоря UTF-8, в декларации XMl должно быть что-то вроде ISO-8859-1.

0 голосов
/ 06 мая 2011

Вы должны использовать правильную библиотеку XML для генерации XML. LibXML2 поставляется в комплекте с PHP и доступен из PHP DOM API . Это, помимо прочего, решит проблемы с кодировкой. Как обычно бывает с такими вещами, это предоплата за обучение, выгода от которой не сразу станет очевидной. Но выгода есть.

...