PHP:特殊字符处的字符串中断

时间:2012-03-16 09:20:37

标签: php zend-framework diacritics zend-pdf

我写了一个小PHP脚本,它在当前的PDF文件上进行“品牌化”。这意味着在每个页面上我都会在特殊位置放置一个类似“属于”的字符串。因此,我使用Zend Framework中的Zend_Pdf。 因为脚本在德语区使用,在一行中我使用特殊字符“ö”(“Gehörtzu”)。

在我的本地计算机(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这样的函数进行了一些实验,但没有任何帮助,我决定在黑暗中停止摸索并打开一个自己的问题。

期待任何提示。提前感谢您的帮助!

编辑:同时我发现了相同的(?)问题,solved on a German forum。但如果我像他们说的那样做......

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

... PDF中的结果品牌是“Gehrt zu”。现在跳过了“ö”。

为此,我找到了another hint on the Zend issue tracker

总结一下,我可以放弃所有UTF8的东西,专注于Latin-1 AKA ISO 8859-1。

我仍然不明白为什么代码在我的Windows + XAMPP上工作,现在崩溃在我的主机Linux上。

2 个答案:

答案 0 :(得分:2)

您的猜测是正确的,问题与编码有关。准确地说编码被搞砸了很难从远处说出来。我假设您不仅使用Zend_Pdf,还使用MVC(意味着完整的Zend_Application)。

您应该通过设置:

来检查您的应用程序是否以UTF-8的形式提供页面
resources.view.encoding = "UTF-8"

并在布局/视图中放置相应的元标记。

根据您使用的编辑器,您的文件可能采用不同的编码进行编码。您可以在Windows上使用Notepad ++检查文件编码并将其转换为UTF-8(如果需要,不要将编码设置为UTF-8,这可能会弄乱您的文件!)。我建议使用Eclipse,文本文件编码设置为“UTF-8”(首选项>常规>工作区),以确保您的代码文件以UTF-8编码。

现在是关键部分:

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

查看最后一个参数...设置它。如果你很幸运,你可以跳过以前的东西,只需在那里设置编码。

编辑:我错过了什么。数据库连接。您也应该检查编码。我经常使用MS SQL Server,它在内部使用Latin-1;没有设置driver_otpions.CharacterSet也会让事情变得非常糟糕。这可能是相关的,如果你有像Gehört zu: Günther这样的东西,其中名字Günther是从db获取的。

答案 1 :(得分:0)

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

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