php imagettftext和特定的表情符号

时间:2014-05-17 04:44:10

标签: php unicode gd imagettftext

我遇到了“杂项符号和象形文字”下的表情符号问题。 unicode block。

以下是一个示例代码:

<?php
    header('Content-Type: image/png');

    $im = imagecreatetruecolor(290, 60);

    $grey = imagecolorallocate($im, 200, 200, 200);
    $black = imagecolorallocate($im, 0, 0, 0);
    imagefilledrectangle($im, 0, 0, 289, 59, $grey);

    $font = 'seguisym.ttf';
    $font = realpath($font);

    //&#127744; is the unicode html entity for a cyclone. It is under 'Miscellaneous Symbols And Pictographs'.
    $text = "&#127744; is a cyclone!";
    imagettftext($im, 20, 0, 5, 22, $black, $font, $text);

    //&#9924; is the unicode html entity for a snowman. It is under 'Miscellaneous Symbols'.
    $text = "&#9924; is a snowman!";
    imagettftext($im, 20, 0, 5, 52, $black, $font, $text);

    imagepng($im);
    imagedestroy($im);
?>

这是输出:

The Cyclone and the Snowman

以下是它的样子:

The Cyclone and the Snowman Part II

如您所见,这些表情符号都在不同的Unicode块下。旋风是在杂项符号和象形文字&#39;并且绘制了HTML实体而不是实际角色,但是雪人在“其他符号”下面。并正确绘制。我已仔细检查以确保我使用的字体包含两个字符。

要清楚,我希望绘制实际字符,而不是HTML实体。

呈现为UTF8的相同字符:

The Cyclone and the Snowman, Part III

1 个答案:

答案 0 :(得分:0)

我遇到了与阿比盖尔TTF同样的问题。经过一些研究,我找到了这个链接

https://bugs.php.net/bug.php?id=17955

其中有这个示例脚本:

<?php
$str = "this is a test";
$str = iconv("UCS-2", "UTF-8", preg_replace("/(.)/","\xf0\$1", $str));

$fsize = 32;
$ffile= "C:/wamp/www/gm/fonts/Aztec/101_Aztec SymbolZ.ttf";

$size = ImageTTFBBox($fsize, 0, $ffile, $str);

$txt_width = ($size[2] - $size[0]);
$txt_height = ($size[1] - $size[7]);

$im_width = $txt_width * 1.5;
$im_height = $txt_height * 1.5;

$im = ImageCreateTrueColor($im_width, $im_height);
$black = ImageColorAllocate($im, 0, 0, 0);
$white = ImageColorAllocate($im, 255, 255, 255);

$txt_x = ($im_width - $txt_width) / 2;
$txt_y = ($im_height - $txt_height) / 2 + $txt_height;

ImageFilledRectangle($im, 0, 0, $im_width, $im_height, $white);
imagecolortransparent( $im, $white );
ImageTTFText($im, $fsize, 0, $txt_x, $txt_y, $black, $ffile, $str);

Imagegif($im, "./test.gif");
ImageDestroy($im);
?>

他们的回答:您必须正确地将您的字符串转换为Unicdoe。这使得Abigail字体能够正确显示。不幸的是,我仍然在研究如何正确显示非标准的TTF文件。但我认为这只是找到他们放置实际字体的位置(如旋风图像)。

另一个令人沮丧的因素是,GD有时会放入正方形,有时会让角色留空。我真的更喜欢永远给出空白字符,因为它返回WIDTH = 0和HEIGHT = 0而广场可以返回有很多不同的大小。如果GD标准化总是给出一个没有大小的空白字符,那么你所要做的就是寻找它。否则 - 你必须跳过篮球才能找到一个正方形。

我希望这有帮助! : - )