PHP функционируют imagettftext () и unicode

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

Попробуйте, как показано ниже:

data = {
 "Bonjour": {
  "English Word": "Hello",
  "Type of word": "whatever",
  "Definition": "Means good day",
  "Use case example": "Bonjour igo",
  "Additional information": "BRO"
  }
  }

currentword = data
search = "Bonjour"

result = dict((k, currentword[search][k]) for k in ['English Word', 'Definition', 'Use case example'])

for k,v in result.items():
    print k + ":" + v

Результат:

Definition:Means good day 
English Word:Hello 
Use case example:Bonjour igo
11
задан user27478 13 October 2008 в 15:33
поделиться

4 ответа

Вот решение, которое наконец работало на меня:

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

Преобразование строки к объектам HTML работает за исключением того, что функция imagettftext () не принимает именованные сущности. Например,

&#26085;&#26412;&#35486;

в порядке, но

&ccedil;

не. При преобразовании назад в ISO-8859-1, преобразовывает именованные сущности назад в символы, но существует вторая проблема. imagettftext () не поддерживает символы со значением, больше, чем> 127. Финал для цикла кодирует эти символы в шестнадцатеричном. Это решение работает на меня с текстом, который я использую (включает японский язык, китайский, и акцентировал латинские символы для португальского языка), но я не на 100% уверен, что это будет работать во всех случаях.

Все они, гимнастика необходима, потому что imagettftext () действительно не принимает строки UTF-8 на моем сервере.

13
ответ дан 3 December 2019 в 03:37
поделиться

Мой главный подозреваемый является шрифтом, который Вы используете для рендеринга.

Согласно http://fr3.php.net/imagettftext, различные версии библиотеки GD, пользовавшейся php, могут показать другое поведение.

  • Версия GD на Вашей локальной машине: 2.0 или выше
  • Версия GD на Вашем webhost сервере: связанный (2.0.34 совместимых)

Править: Другая идея: можно ли проверить это $text = '日本語'; действительно сохраняется как это на Вашем рабочем сервере? Возможно, существует проблема кодирования с Вашим сценарием.

Следующее редактирование: BKB уже предложил это. Таким образом в случае, если это - причина: он был первым с ответом ;-)

0
ответ дан 3 December 2019 в 03:37
поделиться

Тот конкретный файл шрифтов существует на Вашей производственной машине? При использовании FTP для загрузки файлов Вы используете двоичное кодирование?

-1
ответ дан 3 December 2019 в 03:37
поделиться

У меня была такая же проблема со скриптом, который будет выводить текст на изображение и выводить его. Проблема была в том, что из-за разных браузеров (или жесткости кода/паранойи, как бы вы не задумывались), я не мог знать, какая кодировка помещается внутри массива $_GET.

Вот как я решил эту проблему.

$item_text = $_GET['text'];

# detect if the string was passed in as unicode
$text_encoding = mb_detect_encoding($item_text, 'UTF-8, ISO-8859-1');
# make sure it's in unicode
if ($text_encoding != 'UTF-8') {
    $item_text = mb_convert_encoding($item_text, 'UTF-8', $text_encoding);
}

# html numerically-escape everything (&#[dec];)
$item_text = mb_encode_numericentity($item_text,
    array (0x0, 0xffff, 0, 0xffff), 'UTF-8');

Это решает любую проблему с тем, что imagettftext не может обрабатывать символы выше #127, просто меняя ВСЕ символы (включая многобайтовые символы Unicode) на их HTML цифровые символы - "A" для "A", "B" для "B", и т.д. - для чего страница руководства заявляет о поддержке.

.
12
ответ дан 3 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: