У меня есть веб-сайт, работающий в 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
. Я бы осмелился сказать, что столкнулся с ошибкой ...