PHP: разрыв строки в специальном символе - PullRequest
2 голосов
/ 16 марта 2012

Я написал небольшой PHP-скрипт, который выполняет «брендинг» для текущего PDF-файла.Это означает, что на каждой странице я помещаю строку типа «принадлежит» в специальную позицию.Поэтому я использую Zend_Pdf из Zend Framework.Поскольку скрипт используется в области немецкого языка, в одной строке я использую специальный символ "ö" ("Gehört zu").

На моей локальной машине (Windows, XAMPP) скрипт работал нормально, нопри перемещении в веб-пространство моего хостера (немного Linux) строка обрывается на «ö».Это означает, что в моем PDF-файле появляется «Geh».

Код такой:

        if (substr($file, strlen($file) - 4)  === '.pdf') {
            $name = $user->GetName;
            $fontSize = 12;
            $xTextPos = 100;
            $yTextPos = 10;

            set_include_path(dirname(__FILE__)); // set include_path for external library Zend Framework
            require_once('Zend' .DS . 'Pdf.php');
            $pdf = Zend_Pdf::load($file);
            $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);

            $branding = 'Gehört zu ' . $name; // German for: 'Belongs to ', problem with 'ö'

            foreach ($pdf->pages as &$page) {
                $page->setFont($font, $fontSize);
                $page->drawText($branding, $xTextPos, $yTextPos);
            }
        }

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

            $branding = utf8_encode('Gehört zu ') . $name;

... и я провел несколько экспериментов с такими функциями, как html_entity_decode, но ничего не помогло, и я решил прекратить искать в темноте и открыть собственный вопрос.

Ждем любых подсказок.Заранее благодарю за помощь!

РЕДАКТИРОВАТЬ: Между тем я обнаружил ту же (?) Проблему, решенную на немецком форуме .Но если я сделаю это так, как они говорят ...

             $branding = mb_convert_encoding('Gehört zu ', 'ISO-8859-1') . $name;

... в результате PDF-код будет выглядеть как «Gehrt zu»."Ö" теперь пропущено.

Для этого я нашел еще одну подсказку на трекере проблем Zend .

Подводя итог, я могу отбросить все вещи UTF8 исконцентрируйся на Latin-1 AKA ISO 8859-1.

Я до сих пор не понимаю, почему код работал на моем Windows + XAMPP и теперь падает на Linux моего хостера.

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Ваше предположение верно, проблема связана с кодированием.Где именно кодируется, сложно сказать издалека.Я предполагаю, что вы работаете не только с Zend_Pdf, но и имеете MVC на месте (имеется в виду полное Zend_Application).

Вы должны проверить, обслуживает ли ваше приложение страницы как UTF-8, установив:

resources.view.encoding = "UTF-8"

, а также размещение соответствующих мета-тегов в макете / представлении.

В зависимости от того, какой редактор вы используете, ваши файлы могут быть закодированы в другой кодировке.Вы можете использовать Notepad ++ в Windows, чтобы проверить кодировку файла и преобразовать его в UTF-8 (не просто установите кодировку в UTF-8, это может испортить ваш файл!) При необходимости.Я рекомендую использовать Eclipse с кодировкой текстового файла, установленной в «UTF-8» («Предпочтения»> «Основные»> «Рабочая область»), чтобы убедиться, что ваши кодовые файлы закодированы в UTF-8.

Теперь важная часть:

Zend_Pdf_Page::drawText(string $text, float $x, float $y, string $charEncoding)

Посмотрите на последний аргумент ... установите его.Если вам повезет, вы можете пропустить предыдущий материал и просто установить там кодировку.

edit: я что-то пропустил.Соединения с базой данных.Вы также должны проверить кодировку.Я часто работаю с MS SQL Server, который использует Latin-1 для внутреннего использования;не установка driver_otpions.CharacterSet тоже может испортить вещи.Это может быть уместно, если у вас есть что-то вроде Gehört zu: Günther, где Имя Гюнтера взято из базы данных.

0 голосов
/ 16 марта 2012

Кодировка также зависит от кодировки файла.Если вы, например, кодируете свой файл в UTF8 и используете ut8_encode ("ö"), то вы будете кодировать в UTF_8 что-то уже в UTF_8.

Так что вы можете проверить, какова ваша кодировка файла и какаяВаша PDF-библиотека требует.Затем примените правильную формулу / преобразование.

...