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

标签 php image utf-8 gd special-characters

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

我目前正在开发一个简单的系统,它必须生成一个带有文本的图像。一切都很顺利,直到我意识到 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() 确保从提要中收集的数据确实是 UTF-8并且我确保所有当前未正确显示的字符都包含在我提供给 imagettftext() 的字体文件中 通过使用 Windows charmap 工具检查它的功能。

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

编辑

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

Malformed Characters

它应该读作“José González”

编辑No2

对从 xml 提要中检索到的数据使用 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); 

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

最佳答案

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

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

现在所有困扰我的角色(以及我看到的所有新角色)都可以正确显示了!

关于php - 使用 GD ( imagettftext() ) 和 UTF-8 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9458317/

相关文章:

php - 我如何在 laravel 中对两个不同的 Controller 功能方法使用相同的路由

android - 与其他应用分享图像

javascript - 尝试将图像添加到列表中

php - 字符在数据库中存储为奇怪的字符,但在 HTML 中正确呈现

c# - String.Normalize equvilent 在 Windows Phone 上用于 Unicode 组合

php - PHP 中的任意精度数学

PHP 检查值是否存在

php - 保留上传文件的原始文件名时的注意事项

php - 我想为图像区域提供绿色和红色

java - 在 JSP 中使用资源包属性进行国际化,非拉丁文本变为 Mojibake