Отсутствующие символы в JpGraph - PullRequest
1 голос
/ 19 апреля 2010

У меня есть веб-сайт, работающий в 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:

Предупреждение: 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. Я бы осмелился сказать, что столкнулся с ошибкой ...

1 Ответ

0 голосов
/ 29 апреля 2010

Краткое изложение моих выводов:

  1. Вероятно, это ошибка в PHP / 5.3.1 (или в моей двоичной сборке PHP / 5.3.1); PHP / 5.3.2 больше не пропускает символы и не выдает предупреждение.
  2. Обходной путь - кодировать символы, не входящие в ASCII, с помощью числовых сущностей HTML.
...