Работа с символами GD (imagettftext ()) и UTF-8
Просто для протокола - мой первый вопрос здесь, но, надеюсь, не мой последний вклад в сообщество. Но я здесь не поэтому.
В настоящее время я разрабатываю простую систему, которая должна генерировать изображение с текстом на нем. Все шло хорошо, пока я не понял, что GD не может обрабатывать символы UTF-8, такие как
à, č, ž, ä, ø, é
и так далее.
Чтобы разобраться - я пользуюсьimagettftext ()
Пытаясь решить мою проблему, я углубился в гугл, и некоторые решения были возвращены, но ни один из них, к сожалению, полностью не решил мою проблему. В настоящее время я использую этот скрипт, который я нашел в этой теме -PHP функция imagettftext () и Unicode
private function properText($text){
// Convert UTF-8 string to HTML entities
$text = mb_convert_encoding($text, 'HTML-ENTITIES',"UTF-8");
// Convert HTML entities into ISO-8859-1
$text = html_entity_decode($text,ENT_NOQUOTES, "ISO-8859-1");
// Convert characters > 127 into their hexidecimal equivalents
$out = "";
for($i = 0; $i < strlen($text); $i++) {
$letter = $text[$i];
$num = ord($letter);
if($num>127) {
$out .= "&#$num;";
} else {
$out .= $letter;
}
}
return $out;
}
и он отлично работает для некоторых символов, но не для всех, например, с умлаутом не конвертируется правильно.
Поэтому на данный момент я не уверен, где и что искать, поскольку я не могу предсказать вводимые пользователем данные. Чтобы быть более точным, система извлекает имена исполнителей из ленты XML и использует данные для генерации изображения (я не планирую поддерживать иероглифы).
Я удостоверился, что данные, собранные из фида, действительно являются UTF-8 с помощью PHPmb_detect_encoding () и я удостоверился, что все символы, которые в настоящее время не отображаются правильно, добавлены в файл шрифта, который я передаюimagettftext () функция, проверяя это с окнамиCharMap орудие труда.
Надеюсь, я найду здесь ответ и заранее благодарю за помощь!
редактировать
Для уточнения - символы отображаются некорректно или, если быть точнее, заменяются неправильными символами. Вот скриншот -
следует читать "Хосе Гонсалес"
редактировать №2
С помощьюbin2hex () функция для данных, извлеченных из фида xml, возвращает это.
José González -> 4a6f73c3a920476f6e7ac3a16c657a
// input -> bin2hex(input)
редактировать - исправлено
Продолжая исследования, я нашел ответ на свою проблему, этот фрагмент кода сделал это!
$text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8");
$text = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$text);
return($text);
Теперь все персонажи, которые беспокоили меня, отображаются правильно!