type - Función PHP imagettftext() y unicode
php gd create image from text (6)
¿Existe ese archivo de fuente en particular en su máquina de producción? Si usa FTP para cargar sus archivos, ¿está usando codificación binaria?
Estoy usando la función PHP imagettftext () para convertir texto en una imagen GIF. El texto que estoy convirtiendo tiene caracteres Unicode, incluido el japonés. Todo funciona bien en mi máquina local (Ubuntu 7.10), pero en mi servidor de host web, los caracteres japoneses están destrozados. ¿Qué podría estar causando la diferencia? Todo debe estar codificado como UTF-8.
Imagen rota en el servidor webhost: http://www.ibeni.net/flashcards/imagetest.php
Copia de la imagen correcta de mi máquina local: http://www.ibeni.net/flashcards/imagetest.php.gif
Copia de phpinfo () desde mi máquina local: http://www.ibeni.net/flashcards/phpinfo.php.html
Copia de phpinfo () desde mi servidor de host web: http://example5.nfshost.com/phpinfo
Código:
mb_language(''uni'');
mb_internal_encoding(''UTF-8'');
header(''Content-type: image/gif'');
$text = ''日本語'';
$font = ''./Cyberbit.ttf'';
// Create the image
$im = imagecreatetruecolor(160, 160);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
// Create some colors
imagefilledrectangle($im, 0, 0, 159, 159, $white);
// Add the text
imagettftext($im, 12, 0, 20, 20, $black, $font, $text);
imagegif($im);
imagedestroy($im);
Mi principal sospechoso es la fuente que está usando para renderizar.
Según http://fr3.php.net/imagettftext , las diferentes versiones de la biblioteca de GD utilizada por php pueden mostrar un comportamiento diferente.
- Versión de GD en su máquina local: 2.0 o superior
- Versión de GD en su servidor de host web: incluido (compatible con 2.0.34)
Editar: Otra idea: puedes verificar que $text = ''日本語'';
está realmente guardado así en tu servidor de producción? Tal vez haya un problema de codificación con tu script.
Próxima edición: BKB ya propuso eso. Entonces, en caso de que esta sea la causa: fue el primero en responder ;-)
He estado teniendo el mismo problema con un script que renderiza texto en una imagen y lo muestra. El problema fue que, debido a los diferentes navegadores (o la resistencia / paranoia del código, de la forma que quieras pensar), no tenía forma de saber qué codificación se estaba poniendo dentro de la matriz $_GET
.
Así es como resolví el problema.
$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'');
Esto resuelve cualquier problema con imagettftext
no pudiendo manejar los caracteres superiores al # 127 simplemente cambiando TODOS los caracteres (incluyendo caracteres Unicode multibyte) en su entidad de caracteres numéricos HTML - "& # 65;" para "A", "& # 66;" para "B", etc., que admite la página del manual .
Yo tuve el mismo problema. Convertir la fuente de otf a ttf ayudó. Puede usar FontForge (disponible en el repositorio estándar) para convertir.
Aquí está la solución que finalmente funcionó para mí:
$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;
}
}
La conversión de la cadena a entidades HTML funciona, excepto que la función imagettftext () no acepta entidades con nombre. Por ejemplo,
日本語
está bien, pero
ç
no es. Convirtiendo nuevamente a ISO-8859-1, convierte las entidades nombradas a caracteres, pero hay un segundo problema. imagettftext () no admite caracteres con un valor mayor que> 127. El for-loop final codifica estos caracteres en hexadecimal. Esta solución me funciona con el texto que estoy usando (incluye caracteres latinos en japonés, chino y acentuado en portugués), pero no estoy 100% seguro de que funcione en todos los casos.
Todas estas gimnasias son necesarias porque imagettftext () realmente no acepta cadenas UTF-8 en mi servidor.
Enfrenté el mismo problema y encontré una solución fácil de la referencia php PHP ImageTttfText frunction :
Que copie el archivo de fuente requerido, por ejemplo (arial.ttf) en el mismo directorio con su archivo php:
(c:/wamp/www/mysite/mypage.php)
(c:/wamp/www/mysite/arial.ttf)
donde mysite : es su directorio de sitios web
pero intenta cambiar la variable $ font para ser
$font = ''arial.ttf'';