这个功能开发主要涉及几个问题:
1、文字换行
2、汉字乱码问题
1、文字换行,这里面我纠结了一阵之后,发现主要的问题在于 php 里面的单引号和双引号的问题。
我再字符串 ‘我爱中国’ (单引号) 里面添加 \n 作为换行处理,发现 怎么也不成功, 换成 "我爱\n中国" (双引号) 就可以了
主要就是php 单引号和双引号的区别。可能刚开始你会觉得不都是引用字符串没有什么区别。其实,区别大了。
单引号 引起来的字符串 是不对里面的特殊字符串做解析的,'我爱\n中国' 用 echo 打印出来 就是 我爱\n中国 没有做换行处理。而用双引号,是会做换行处理的。
当然,单引号执行的效率会高一些,如果在遇到一些需要对特殊字符串处理的地方还是要用双引号。
2. 汉字乱码的问题,纠结了很久,网上找到 有的说是要全部转为utf-8的编码 包括.php文本,输出的字符串等。最后这些都做了,还是乱码。有的说是,php 编译的时候是带着日本的字符编码的,所以会出错,但是我不可能去重新编译php程序。最后,找到的解决办法是,换了一种字体-------- simhei.ttf 。很神奇,只能说,这个是字体的原因。
附上 ,我写的和在网上找的代码的综合体
<?php
namespace Addons\Word2Png\Controller;
use Home\Controller\AddonsController;
use Think;
class Word2PngController extends AddonsController{
public function index(){
$this->display(T('Addons://Word2Png@Word2Png/index'));
}
/**
* 图片转文字算法
* @author hani <[email]>
*/
public function url(){
$words = I('words');
echo $res = addons_url('Word2Png://Word2Png/change',array('words'=>$words)) ;
}
public function change(){
//$words = I('words');
$words = "顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶速度是多少ssssssssssssssssssssssss" ;
//echo get_str_num($words);die();
// $words = mb_convert_encoding( $words , 'UTF-8', 'GB2312' );
//die();
$font = 30; //字体宽
$x = 306; //图片宽
$temp = $font * ceil( (get_str_num($words)*$font)/$x );
$y = $temp ? $temp: $font ; //图片的高
$words = $this->autowrap($font,0,"./Arial/arial.ttf" ,$words,$x);
$im = @imagecreate($x, $y);
$background_color = imagecolorallocate($im, 255, 255, 255);
$text_color = imagecolorallocate($im, 233, 14, 91);
header("Content-type: image/png");
ImageTTFText($im, 15, 0, 40, 20, $text_color, "./Arial/simhei.ttf", $words);
imagepng($im);
imagedestroy($im);
}
function autowrap($fontsize, $angle, $fontface, $string, $width) {
// 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度
$content = "";
// 将字符串拆分成一个个单字 保存到数组 letter 中
for ($i=0;$i<get_str_num($string);$i++) {
$letter[] = msubstr($string, $i, 1,'utf-8',false);
}
foreach ($letter as $l) {
$teststr = $content." ".$l;
$testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
// 判断拼接后的字符串是否超过预设的宽度
if (($testbox[2] > $width) && ($content !== "")) {
$content .= " \n";
}
$content .= $l;
}
return $content;
}
}