【问题标题】:Working with GD ( imagettftext() ) and UTF-8 characters使用 GD ( imagettftext() ) 和 UTF-8 字符
【发布时间】:2014-06-26 10:45:52
【问题描述】:

仅作记录 - 我在这里的第一个问题,但希望不是我在社区中的最后一次输入。 但这不是我来这里的原因。

我目前正在开发一个简单的系统,该系统必须生成带有文本的图像。一切都很顺利,直到我意识到 GD 无法处理像

这样的 UTF-8 字符

ā, č, ž, ä, ø, é

等等。

为了解决问题 - 我正在使用 imagettftext()

为了解决我的问题,我深入研究了谷歌并返回了一些解决方案,遗憾的是,它们都没有完全解决我的问题。 目前我正在使用我在这个线程中找到的这个脚本 - PHP function imagettftext() and unicode

private function properText($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;
        }
    }

    return $out;

}

它适用于某些字符但并非所有字符都可以正常工作,例如,带有变音符号的 a 不能正确转换。

因此,由于我无法预测用户输入,因此目前我不确定该在哪里寻找什么内容。更准确地说,系统从 xml 提要中提取艺术家姓名并使用数据生成图像(我不打算支持象形文字)。

我通过使用 PHP 的 mb_detect_encoding() 确保从提要中收集的数据确实是 UTF-8,并且我已经确保当前未正确显示的所有字符都包含在我的字体文件中'm feed to the imagettftext() 通过使用 windows charmap 工具检查它的功能。

希望我能在这里找到我的答案,并提前感谢您的帮助!

编辑

澄清 - 字符显示不正确,或者更准确地说,被格式错误的字符替换。这是截图 -

它应该是“何塞·冈萨雷斯”

编辑 No2

对从 xml 提要检索的数据使用 bin2hex() 函数会返回 this。

José González -> 4a6f73c3a920476f6e7ac3a16c657a
// input -> bin2hex(input)

编辑 - 已修复

当我继续研究时,我为我的问题找到了答案,这段代码做到了!

$text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8");
$text = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$text);
return($text); 

现在困扰我的所有字符都正确显示了!

【问题讨论】:

  • 什么不完全有效?输出怎么不是你期望的?您是否使用实际包含所需字符的字体?我正在使用带有日语的imagegettftext,所以 Unicode 字符通常不是问题。
  • 是的,正如我在原帖中所说的那样我已确保当前未正确显示的所有字符都已插入字体文件中。起作用的是输出 - 字符显示不正确,或者更准确地说,被格式错误的字符替换。这是一个截图 - imgur.com/B8RHa - 它应该是“José González”
  • 出现的错误:i.imgur.com/B8RHa.jpg 绝对是编码问题,例如在 ANSI 中打印一些 UTF-8 字符。
  • 您的文本真的是否以 UTF-8 正确编码?请显示字符串的bin2hex()
  • 您应该将其添加为答案并接受它。将来可能对其他人有用。仍然很奇怪,因为该函数应该直接接受 UTF-8。

标签: php image utf-8 gd special-characters


【解决方案1】:

当我继续研究时,我想出了解决问题的答案,这段代码做到了!

private function properText($text){
    $text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8");
    $text = preg_replace('~^(&([a-zA-Z0-9]);)~',htmlentities('${1}'),$text);
    return($text); 
}

现在困扰我的所有字符(以及我见过的所有新字符)都正确显示了!

【讨论】:

  • 这个特殊的preg_replace 回调似乎很荒谬。确定这有效吗?
  • 我也有同样的问题。真的是怎么修好的?您的代码不会返回带有重音符号的文本。 stackoverflow.com/questions/23551989/…
【解决方案2】:

首先确保您的 IDE 没有以 UTF8 以外的其他编码保存文件。例如,新的 Intellij IDEA 9 在 Windows 平台上将 UTF-8 更改为 WINDOWS-1250。如果您没有注意到这一点,并且您将使用常量字符串进行测试,那么调试起来非常疯狂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多