2011-01-26 3 views
1

Мы получаем данные в формате base64 (XML) от третьей стороны. Если данные XML находятся на английском языке, все работает отлично, я могу выполнить декодирование base64 и проанализировать XML. Если XML - это все французские символы нижнего регистра, все работает нормально. Но если данные xml содержат верхние регистры французских символов (например, Agrave), если я делаю base64-декодирование и пытаюсь его проанализировать, синтаксический анализатор терпит неудачу. Любые предложения по устранению этой проблемы?base64 decode French characters

Спасибо.

+0

Вам необходимо предоставить больше информации, как синтаксический анализатор файлов, какие сообщения об ошибке вы получаете, и т.д. –

+0

Проблема, очевидно, в парсере ... какой инструмент вы используете? – Spechal

+0

Кодировка символов XML - UTF-8. Это то, что я делаю, чтобы разобрать xml. – user471317

ответ

1

Что такое кодировка символов XML? Возможно, это не UTF-8, и ваш синтаксический анализатор пытается проанализировать строку XML как UTF-8.

0

Это похоже на проблему с кодировкой. Вы пытались установить кодировку парсера перед разбором? Какой парсер вы используете?

+0

$ xml = simplexml_load_string ($ data); – user471317

3

Base64 - это способ кодирования 8-битных двоичных данных с использованием 7-битных/US-ASCII-символов. После декодирования Base64 вы должны иметь стандартный XML-файл. Возможно, этот XML-файл содержит недопустимые символы или неправильно указывает кодировку символов, которую он использует.

Вы упомянули À, представление (& lt; XML) & Agrave; Если XML содержит строку с кодировкой HTML À, также должна быть ссылка в XML на таблицу сущностей, определяющую, как декодировать эту строку.

В качестве альтернативы, если ваш XML содержит & Agrave; символ, закодированный с использованием (например) набора символов ISO-8859-1, либо ваш XML должен указывать эту кодировку (<?xml version="1.0" encoding="ISO-8859-1"?>), либо вы должны указать ее самостоятельно при ее расшифровке. В противном случае парсер может принять (например, кодирование UTF-8) и не будет работать при попытке декодирования & Agrave ;.

Точное сообщение об ошибке должно сообщить вам, в чем проблема.

[обновление: & Agrave; direct]: Похоже, что XML недействителен; что они говорят UTF-8, но на самом деле используют другую кодировку. Проверьте байты XML (после декодирования базы 64); если & Agrave; закодирован как один байт, это определенно не UTF-8.

[обновление: как исправить?] Если они неправильно указали его в заголовке XML, они должны действительно заменить неверный заголовок (<?xml version="1.0" encoding="UTF-8"?>) на правильный (<?xml version="1.0" encoding="windows-1252"?>). Если они ничего не указывают, похоже, что функция iconv может быть вашим лучшим выбором. Мне это действительно не нужно, поэтому я не уверен на 100%, но похоже, что вы можете использовать: $ data = iconv («ISO-8859-1», «UTF-8», $ data) после base64_decode и до simplexml_load_string. Я не знаю, как указать кодировку непосредственно при декодировании XML.

Я не очень опытный с PHP особенностей кодирования символов, поэтому я не даю никаких гарантий ...

+0

Они используют французский символ À напрямую. Они устанавливают кодировку xml в UTF-8. Я пытаюсь проанализировать данные xml, подобные этому, $ xml = simplexml_load_string ($ data). Значение $ xml равно 0 после выполнения этой строки. – user471317

+0

Вот пример xml. Закодированные данные, которые я получаю от них (приложение java), отличаются от кодированной строки, которую я возвращаю из PHP base64_encode ($ xmlstr). <[CDATA [Тест французский характер: À]]!> user471317

+0

Вы можете проверить, если À кодируется как байты 0xC3 0x80 (UTF -8) или как 0xC0 (изо-8859-1)? – beetstra

Смежные вопросы