Intereting Posts

Работа с символами GD (imagettftext ()) и UTF-8

Только для записи – мой первый вопрос здесь, но, надеюсь, не мой последний вклад в сообщество. Но я не здесь.

В настоящее время я разрабатываю простую систему, которая должна генерировать изображение с текстом на нем. Everthing прошел хорошо, пока я не понял, что GD не может обрабатывать символы UTF-8, такие как

ā, č, ž, ä, ø, é

и так далее.

Чтобы прояснить ситуацию – я использую imagettftext ()

Пытаясь решить мою проблему, я вырыл в глубину Google, и некоторые решения были возвращены, ни одна из них, к сожалению, не решила мою проблему полностью. В настоящее время я использую этот скрипт, который я нашел в этом потоке – PHP function 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 с использованием PHP mb_detect_encoding (), и я убедился, что все символы, которые в настоящее время не отображаются правильно, отображаются в файле шрифта, который я кормлю к функции imagettftext () , проверив ее с помощью инструмента charmap .

Надеюсь, я смогу найти свой ответ и поблагодарить вас за вашу помощь заранее!

редактировать

Чтобы уточнить – символы отображаются неправильно или, если быть более точным, заменены неверными символами. Вот скриншот –

Неверные символы

он должен читать «Хосе Гонсалес»

Редактировать No2

Использование функции bin2hex () для данных, полученных из корня xml, возвращает это.

 José González -> 4a6f73c3a920476f6e7ac3a16c657a // input -> bin2hex(input) 

edit – исправлено

Когда я продолжил свое исследование, я придумал ответ на мою проблему, этот фрагмент кода сделал это!

 $text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8"); $text = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$text); return($text); 

Теперь все персонажи, которые беспокоили меня, отображаются правильно!

Когда я продолжил свое исследование, я придумал ответ на мою проблему, этот фрагмент кода сделал это!

 private function properText($text){ $text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8"); $text = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$text); return($text); } 

Теперь все персонажи (и все новые, которые я видел), которые беспокоили меня, отображаются правильно!

Прежде всего убедитесь, что ваша среда IDE не сохраняет файл в другой кодировке, чем UTF8. Например, новый Intellij IDEA 9 изменил UTF-8 на WINDOWS-1250 на платформе Windows. Если вы этого не заметите, и вы будете использовать постоянные строки для тестирования, это довольно сумасшествие для отладки.