我有一个在 Windows 上运行并使用cp1252
(aka Win-1252
) 的网站,因此它可以显示西班牙语字符。该应用程序使用JpGraph 2.3生成一些图。这些绘图使用 Tahoma Open Type 字体系列来显示文本标签。ANSI 中提供了字符串(即cp1252),字体文件支持cp1252(实际上,*.ttf 文件是从系统的字体文件夹中复制的)。
它在从 PHP/5.2.6 到 PHP/5.3.0 的多个设置中运行良好。当我在PHP/5.3.1下运行应用程序时出现问题:所有非 ASCII 都被表示缺失或未知字符的空心矩形替换。
JpGraph 的文档对于它如何期望国际字符不是很精确。显然,文本由 imagettftext() 函数在内部处理,该函数需要 UTF-8。但是,将所有内容编码为 UTF-8 会破坏所有系统中的应用程序。在 ANSI 以前可以正常工作的地方,我得到了错误的字符(Ê而不是Ú)。在我丢失字符的地方,现在我得到一个 PHP 错误:
警告:imagettftext():any2eucjp():发生了什么事
您是否知道 GD2 从 PHP/5.3.0 到 5.3.1 的哪些变化可能会影响非 ASCII 字符的呈现?我应该如何为 JpGraph 提供 Win-1252 字符集中的字符串?
更新
明确地说,这个问题与 JpGraph 无关。我可以通过对 imagettftext() 的简单调用来重现该问题:
<?php
$im = imagecreatetruecolor(400, 30);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);
//$text = 'áéíóú ÁÉÍÓÚ'; # ANSI
$text = utf8_encode('áéíóú ÁÉÍÓÚ'); # UTF8
$font = '/path/to/tahomabd.ttf';
imagettftext($im, 15, 0, 10, 25, $black, $font, $text);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>
在 PHP/5.3.0 中,ANSI 和 UTF-8 都呈现正确的文本。在 PHP/5.3.1 中,ANSI 呈现错误字符,UTF-8 触发any2eucjp(): something happen
内部错误。我敢说我遇到了一个错误...