使用GD(imagettftext())和UTF-8字符

时间:2012-02-26 23:29:39

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

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

我目前正在开发一个简单的系统,必须生成一个带有文本的图像。 Everthing进展顺利,直到我意识到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;

}

并且它适用于某些字符但不是全部,例如,变音符号未正确转换。

所以在这一点上,由于我无法预测用户输入,我不知道在哪里以及要查找什么。更确切地说,系统从xml提要中提取艺术家名称并使用数据生成图像(我不打算支持象形文字)。

我确保使用PHP mb_detect_encoding()从Feed中收集的数据确实是UTF-8,并确保当前未正确显示的所有字符都填入字体中文件我正在加入 imagettftext() 通过windows charmap 工具检查它。

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

修改

澄清 - 字符未正确显示,或者更确切地说,字符不正确。这是一个截图 -

Malformed Characters

它应该是“JoséGonzález”

编辑No2

对从xml Feed中检索到的数据使用 bin2hex()函数会返回此信息。

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); 

现在所有困扰我的角色都能正确显示!

2 个答案:

答案 0 :(得分:5)

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

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); 
}

现在所有困扰我的人物(以及我见过的所有新人物)都能正确显示!

答案 1 :(得分:0)

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