Работа с символами GD (imagettftext ()) и UTF-8 - PullRequest
10 голосов
/ 27 февраля 2012

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

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

а, č, ž, ä, ø, é

и так далее.

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

Пытаясь решить мою проблему, я углубился в Google и вернул некоторые решенияНикто из них, к сожалению, не решил мою проблему полностью.В настоящее время я использую этот скрипт, который нашел в этой теме - 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;

}

, и он отлично работает для некоторых символов, но не для всех, например., a с умлаутом не конвертируется правильно.

Так что на данный момент я не уверен, где и что искать, так как я не могу предсказать вводимые пользователем данные.Чтобы быть более точным, система извлекает имена исполнителей из ленты XML и использует данные для генерации изображения (я не планирую поддерживать иероглифы).

Я убедился, что данные, собранные изфид действительно UTF-8 с использованием PHP mb_detect_encoding () , и я убедился, что все символы, которые в данный момент отображаются неправильно, добавляются в файл шрифта, который я передаю в imagettftext () работает, проверяя его с помощью инструмента windows charmap .

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

edit

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

Malformed Characters

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

edit №2

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

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

edit - fixed

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

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

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

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

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

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); 
}

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

0 голосов
/ 02 августа 2015

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

...