gpt4 book ai didi

php - 使用 imagettftext() 时如何处理字体文件不支持的字符?

转载 作者:可可西里 更新时间:2023-11-01 14:02:58 24 4
gpt4 key购买 nike

我在由 PHP GD 库创建的图像中使用 Verdana 字体。

imagettftext($image, $fontSize, 0, 70, $y, $color, $font, $username );

大多数情况下 imagettftext 对字符串工作得很好。
但是我的一些用户在他们的名字中使用了奇怪的字符/符号。
因此,当我尝试将他们的名字打印到图像时。例如:
enter image description here

该用户使用 ɦɪɲɣƙƨєʌɾ符号。所以 Verdana 无法打印它们。

我用过这个:

$username=iconv('UTF-8', 'ASCII//TRANSLIT', $username);

输出是这样的:
enter image description here

(当前语言环境在英语和德语之间发生变化。因此可能当前语言环境无法处理这些字符:ɦɪɲɣƙƨєʌɾ)

似乎不可能将 ɦ 音译为 h,将 ɲ 音译为 n 而不写一个非常大 str_replace() block 。喜欢this .

  • 所以我想知道是否可以检查字体(Verdana)是否可以显示这些符号。如果其中一个字符无法在字符串中显示,那么我可以将一个空字符串传递给 imagettftext 方法。我可以检查 font 中支持的字符吗?或者创建一个包含 Verdana 支持的符号的字符映射表,并检查我的字符串是否包含不受支持的符号?
    (我认为这是不可能的,因为 this question )

  • 或者另一种解决方案,是否可以在 imagettftext() 中使用多种字体?
    比如先试试Verdana,如果Verdana不覆盖那符号就用Arial sans serif等。

  • 或者任何其他解决方案?

编辑:
似乎 Verdana 不支持我的文本中的这些 un​​icode 字符。
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ğ :

我现在手头没有 v5.4,所以我无法判断 Transliterator,但是 Kemal Dağ 的 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()

P.S. 字符串“ɦɪɲɣƙƨєʌɾ”是由国际音标中的字符组成的。我不确定任何 locale 是否支持这些字符(因为没有实际需要,因为它们不被任何真正的人类语言使用)。

关于php - 使用 imagettftext() 时如何处理字体文件不支持的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22271634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com