2

我写了一个小的 PHP 脚本,它在当前的 PDF 文件上做一个“品牌化”。这意味着在每一页上,我都会在特殊位置放置一个类似“属于”的字符串。因此,我使用 Zend 框架之外的 Zend_Pdf。由于该脚本用于德语区域,因此在其中的一行中我使用了特殊字符“ö”(“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 上崩溃。

4

2 回答 2

2

您的猜测是正确的,问题与编码有关。从远处很难说编码到底在哪里搞砸了。我假设您不仅使用 Zend_Pdf,而且还有 MVC(意味着完整的 Zend_Application)。

您应该通过设置检查您的应用程序是否以 UTF-8 格式提供页面:

resources.view.encoding = "UTF-8"

并在您的布局/视图中放置适当的元标记。

根据您使用的编辑器,您的文件可能以不同的编码进行编码。您可以在 Windows 上使用 Notepad++ 来检查您的文件编码并将其转换为 UTF-8(不要只是将编码设置为 UTF-8,这可能会弄乱您的文件!)如有必要。我建议使用 Eclipse 并将文本文件编码设置为“UTF-8”(Preferences > General > Workspace),以确保您的代码文件以 UTF-8 编码。

现在到了关键部分:

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

看到最后一个参数......设置它。如果幸运的话,您可以跳过前面的内容并在那里设置编码。

编辑:我错过了一些东西。数据库连接。您也应该检查那里的编码。我经常使用内部使用 Latin-1 的 MS SQL Server;不设置driver_otpions.CharacterSet也会把事情搞得一团糟。这可能是相关的,如果你有类似Gehört zu: Günther的东西,名字 Günther 是从 db 中获取的。

于 2012-03-16T09:38:47.767 回答
0

编码也取决于文件编码。例如,如果您使用 UTF8 对文件进行编码并使用 ut8_encode("ö"),那么您将在 UTF_8 中对 UTF_8 中已有的内容进行编码。

因此,您可能想检查您的文件编码是什么,以及您的 PDF 库需要什么。然后应用正确的公式/转换。

于 2012-03-16T09:24:32.480 回答