DomDocument и специальные символы, записанные в два байта - PullRequest
1 голос
/ 11 января 2011

У меня есть веб-приложение, написанное на PHP, основанное на UTF-8 (оба PHP и MySQL находятся на UTF-8 ).Все прекрасно - никаких проблем со спецсимволами.

Однако мне пришлось построить экспорт в XML с кодировкой ISO-8859-2 (польский), поэтомуЯ выбрал DomDocument, потому что он имеет встроенное преобразование кодировки.

Но когда я отправил XML моему партнеру для проверки, он сказал, что в одном из тегов слишком много символов.Это было странно, потому что у него было определенное максимальное количество символов.Затем я открыл файл в HexEditor и увидел, что у каждого специального символа есть два байта.

Я попытался преобразовать результат с помощью iconv и mb_convert_encoding.

Iconv говорит:

iconv() [<a href='function.iconv'>function.iconv</a>]: Detected an illegal character in input string in file application/controllers/report/export.php at 169

mb_convert_encoding просто удаляет все специальные символы, а результат кодируется в ASCII.

Есть ли способ преобразовать выходные данные DomDocument в однобайтовые символы?

Заранее спасибо!

1 Ответ

1 голос
/ 11 января 2011

Одна проблема при переключении между кодировками состоит в том, что даже при транслитерации не все символы представляются в других кодировках в одном байте.

Например, рассмотрим ЕВРОЗНАК , aсимвол, который занимает 3 байта при кодировании в UTF-8.Если вы посмотрите на страницу поддержки кодировки , то увидите, что ISO-8859-2 не указан в списке.

Поскольку нет ни одного символа, представляющего знак евро, тогда транслитерация делаетлучше всего по-прежнему представлять его в выходных данных

echo iconv( 'UTF-8', 'ISO-8859-2//TRANSLIT', '€' ); // EUR

В этом примере мы по-прежнему имеем 3 байта для представления знака евро после транслитерации.

РЕДАКТИРОВАТЬ

PS Ошибка уровня NOTICE, которую вы получаете, заключается в том, что вы выполнили iconv () без флага транслитерации.И, как я подчеркнул выше, ЗНАК ЕВРО не существует в ISO-8859-2, поэтому у вас явно есть хотя бы один символ в ваших данных, которого также нет в ISO-8859-2, так что вы будете иметь для использования транслитерации.Просто знайте, что это не гарантирует, что вы получите до 1 байта / символ.

...