我写了一个小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库需要什么。然后应用正确的公式/变换。