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