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


PHP: string breaks at special character

我写了一个小PHP脚本,它在当前的PDF文件上做"品牌"。这意味着在每一页上,我都会在一个特殊的位置放一个类似"属于"的字符串。因此,我使用了Zend框架之外的Zend_Pdf。因为这个脚本是在德语区使用的,所以在其中一行中我使用了特殊字符"ö"("Gehört zu")。

在我的本地机器(Windows,XAMPP)上,脚本运行良好,但当将其移动到宿主的Web空间(一些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上崩溃。

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

您应该通过设置来检查您的应用程序是否将页面作为UTF-8提供

resources.view.encoding = "UTF-8"

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

根据您使用的编辑器,您的文件可能会以不同的编码进行编码。您可以在Windows上使用Notepad++检查文件编码,并在必要时将其转换为UTF-8(不要只是将编码设置为UTF-8,这可能会弄乱您的文件!)。我建议使用文本文件编码设置为"UTF-8"的Eclipse(首选项>常规>工作区),以确保代码文件以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这样的东西,其中Name Günther是从数据库中获取的,那么这可能是相关的。

编码也取决于文件编码。例如,如果你用UTF8编码文件,并使用ut8_encode("ö"),那么你将用UTF_8编码一些已经在UTF_8中的东西。

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