php – 使用imagettftext()时,如何处理字体文件不支持的字符?
作者:互联网
我在PHP GD库创建的图像中使用Verdana字体.
imagettftext($image, $fontSize, 0, 70, $y, $color, $font, $username );
大多数情况下,imagettftext非常适合字符串.
但是我的一些用户在名字中使用了奇怪的字符/符号.
所以,当我尝试将他们的名字打印到图像时.例如:
该用户使用ɦɪɲɣƙƨєʌɾ
符号.所以Verdana无法打印出来.
我用过这个:
$username=iconv('UTF-8', 'ASCII//TRANSLIT', $username);
输出是这样的:
(当前语言环境在英语和德语之间发生变化.因此,当前语言环境可能无法处理这些字符:ɦɪɲɣƙƨєʌɾ)
似乎无法在不编写非常大的str_replace()块的情况下将trans音译到h,ɲ到n.像this.
>所以我想知道是否可以检查字体(Verdana)是否可以显示这些符号.如果其中一个字符无法在字符串内显示,那么我可以将空字符串传递给imagettftext方法.我可以检查字体内支持的字符吗?或者创建一个包含Verdana支持的符号的字符映射,并检查我的字符串是否包含不支持的符号?
(我认为由于this question不可能)
>或者也许是另一种解决方案,是否可以在imagettftext()中使用多种字体?
例如,首先尝试Verdana,如果Verdana没有涵盖那些符号使用Arial sans serif等.
>或任何其他解决方案?
编辑:
似乎Verdana在我的文本中不支持这些unicode字符.
Verdana支持角色:http://www.fileformat.info/info/unicode/font/verdana/grid.htm
Verdana不支持的字符:http://www.fileformat.info/info/unicode/font/verdana/missing.htm
解决方法:
我的第一选择是切换到支持您希望能够处理的全部字符的字体.但是不要指望单个字体会实现million-or-so possible characters in UTF-8.
现在,如果你想采用(懒惰)音译路线,我将参考this answer from Kemal Dağ:
> PHP> = 5.4:使用新的内置Transliterator
类
> PHP< 5.4:使用his excellent port
我现在手头没有v5.4所以我无法讲述Transliterator,但KemalDağ的JTransliteration端口表现相当不错:
<?php
require 'transliteration/JTransliteration.php';
$input = 'ɦɪɲɣƙƨєʌɾ';
echo JTransliteration::transliterate($input); // output: hIngk2ie^r
$input = 'Хეλлఒ Wओრলद';
echo JTransliteration::transliterate($input);
最后,如果你想检查给定的字体是否支持给定的字符,它会变得更加毛茸茸. This library将会有很大帮助.它需要> = 5.3(使用命名空间):
<?php
$fontFile = 'arial.ttf';
$charToCheck = 'ɣ';
require_once 'php-font-lib-master/src/FontLib/Autoloader.php';
use FontLib\Font;
use FontLib\TrueType\Collection;
$font = Font::load($fontFile);
if ($font instanceof Collection) {
$font = $font->getFont(0);
}
$subtable = null;
foreach($font->getData("cmap", "subtables") as $_subtable) {
if ($_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) {
$subtable = $_subtable;
break;
}
}
if (isset($subtable["glyphIndexArray"][ord_utf8($charToCheck)])) {
$supported = 'Supported';
} else {
$supported = 'Not Supported';
}
echo "$charToCheck is $supported by font $fontFile";
function ord_utf8($c) {
$b0 = ord($c[0]);
if ( $b0 < 0x10 ) {
return $b0;
}
$b1 = ord($c[1]);
if ( $b0 < 0xE0 ) {
return (($b0 & 0x1F) << 6) + ($b1 & 0x3F);
}
return (($b0 & 0x0F) << 12) + (($b1 & 0x3F) << 6) + (ord($c[2]) & 0x3F);
}
来自font_info.php
和R. Hill的ord_utf8()
的无耻掠夺代码
附:字符串“ɦɪɲɣƙƨєʌɾ”由国际音标字符组成.我不确定任何语言环境是否支持这些字符(因为它没有实际需要,因为它们不被任何真正的人类语言使用).
标签:php,fonts,utf-8,gd,imagettftext 来源: https://codeday.me/bug/20190517/1120216.html