题
我正在使用PHP函数imagettftext()将文本转换为GIF图像。我正在转换的文本具有Unicode字符,包括日语。在我的本地计算机(Ubuntu 7.10)上一切正常,但是在我的Web主机服务器上,日语字符混乱。是什么造成了差异?一切都应编码为UTF-8。
webhost服务器上的图像损坏: http://www.ibeni.net/flashcards/imagetest.php
从本地计算机复制正确的图像: http://www.ibeni.net/flashcards/imagetest.php.gif
从本地计算机复制phpinfo(): http://www.ibeni.net/flashcards/phpinfo.php.html
从我的webhost服务器复制phpinfo(): http://example5.nfshost.com/phpinfo
代码: 通用标签
解决方案
这是最终对我有用的解决方案: 通用标签
将字符串转换为HTML实体是可行的,但函数imagettftext()不接受命名实体。例如, 通用标签
可以,但是 通用标签
不是。转换回ISO-8859-1,将命名的实体转换回字符,但是存在第二个问题。imagettftext()不支持值大于> 127的字符。最终的for循环将这些字符编码为十六进制。此解决方案对我正在使用的文本有效(包括日语,中文和葡萄牙语的加重拉丁字符),但我不确定100%可以在所有情况下都可以使用。
所有这些体操都是必需的,因为imagettftext()在我的服务器上并不真正接受UTF-8字符串。
其他提示
我在脚本中遇到了同样的问题,该脚本将在图像中渲染文本并将其输出。问题是,由于不同的浏览器(或代码强度/偏执狂,无论您想使用哪种方式),我都无法知道在$_GET
数组中放置了哪种编码。
这是我解决问题的方式。 通用标签
这可以解决imagettftext
无法处理#127以上字符的任何问题,只需将所有字符(包括多字节Unicode字符)更改为它们的HTML数字字符实体-“A”即可。代表“ A”,“B”代表“ B”等。手册页声称支持。
我有同样的问题。将字体从otf转换为ttf很有帮助。您可以使用FontForge(在标准存储库中提供)进行转换。
我主要怀疑是您用于渲染的字体。
根据 http://fr3.php.net/imagettftext ,不同版本的GDphp使用的库可以显示不同的行为。
-
您本地计算机上的
- GD版本: 2.0或更高版本
- Web主机服务器上的GD版本:已捆绑(兼容2.0.34)
编辑: 另一个想法:您可以验证
$text = '日本語';
确实以这种方式保存在生产服务器上吗?您的脚本可能存在编码问题。下一步编辑: BKB已经提出了该建议。因此,以防万一,原因是:他首先回答了;-)
生产机器上是否存在该特定字体文件?如果使用FTP上传文件,是否使用二进制编码?