我有一个在 Windows 上运行并使用的网站 cp1252 (又名 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 错误:

警告:图像TTF文本():任何2eucjp():有事发生

您是否知道 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 内部错误。我敢说我遇到了一个错误......

有帮助吗?

解决方案

我的发现摘要:

  1. 这可能是 PHP/5.3.1 中的错误(或我的 PHP/5.3.1 二进制版本中的错误);PHP/5.3.2 不再丢失字符或引发警告。
  2. 解决方法是使用数字 HTML 实体对非 ASCII 字符进行编码。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top