1

我有一个在 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内部错误。我敢说我遇到了一个错误...

4

1 回答 1

0

我的发现总结:

  1. 这可能是 PHP/5.3.1(或我的 PHP/5.3.1 二进制构建)中的错误;PHP/5.3.2 不再丢失字符或抛出警告。
  2. 一种解决方法是使用数字 HTML 实体对非 ASCII 字符进行编码。
于 2010-04-29T14:47:58.857 回答