在imagettftext()函数中从右到左读取文本字符串

时间:2014-04-16 21:39:12

标签: php imagettftext

我知道这个问题可能听起来很奇怪,但我很担心我为什么来找你......

我想用imagettftext()从右到左而不是从左到右写一个文本字符串;功能

我在手册中读到角度变量控制它,它说0角度意味着从左到右,所以我尝试了180,360但没有任何反应

我需要用什么角度来让它从右到左书写

我正在写一个带有支持希伯来字符

的font.ttf的希伯来语文本字符串
<?php   
$white = imagecolorallocate($background, 255, 255, 255);
$fontfile = "davidtr.ttf";
$string = "מחלדגכ";
imagettftext($background, 12, 360, 3, 17, $white, $fontfile, $string);

?>

我也使用了这个函数strrev(),

$white = imagecolorallocate($background, 255, 255, 255);
$fontfile = "davidtr.ttf";
$string = strrev("עברית");
//imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
imagettftext($background, 12, 0, 3, 17, $white, $fontfile, $string);

现在文字搞砸了图像,有些字母是白框

然后我使用了这个功能:

function utf8_strrev($str){
   preg_match_all('/./us', $str, $ar);
   return join('',array_reverse($ar[0]));
}

它给了我很多帮助,但现在它也颠倒了整数

$string = "מחל 65 דגכ";
echo utf8_strrev($string);
//Now string revered but 65 converted to 56

请你给我一个更好的解决方案,只有希伯来字符变成反转而不是整数。

先谢谢,因为我知道有些开发人员会帮助我。

5 个答案:

答案 0 :(得分:5)

您可以像这样更改utf8_strrev():

#include <iostream>
#include <string>
#include <codecvt>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
    std::string str = "\\u8f93\\u5165\\u7684";
    std::u16string u16;
    qi::parse(str.begin(), str.end(), *("\\u" >> qi::hex), u16);
    std::string u8 = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>().to_bytes(u16);
    std::cout << "utf 8 string " << u8 << " consiting of " << u8.size() << " bytes\n";
}

这样你匹配的不是数字或数字序列的所有东西。

因此,字符串“one 123 two”将导致字符串“owt 123 eno”。

utf8_strrev()中的数组$ ar就像在preg_match_all()之后的那样:

function utf8_strrev($str){
   preg_match_all('/([^\d]|\d+)/us', $str, $ar);
   return join('',array_reverse($ar[0]));
}

答案 1 :(得分:1)

<?php

  function hebstrrev($string, $revInt = false, $encoding = 'UTF-8'){
    $mb_strrev = function($str) use ($encoding){return mb_convert_encoding(strrev(mb_convert_encoding($str, 'UTF-16BE', $encoding)), $encoding, 'UTF-16LE');};

    if(!$revInt){
      $s = '';
      foreach(array_reverse(preg_split('/(?<=\D)(?=\d)|\d+\K/', $string)) as $val){
        $s .= ctype_digit($val) ? $val : $mb_strrev($val);
      }
      return $s;
    } else {
      return $mb_strrev($string);
    }
  }

  echo hebstrrev("מחל 65 דגכ"); // outputs: כגד 65 לחמ
  echo hebstrrev("מחל 65 דגכ", true); // outputs: כגד 56 לחמ

?>

此函数使用可选参数反转字符串,以反转字符串中的整数。它还允许更改字符串的编码,因此无论使用何种语言,它都应该是通用的。

答案 2 :(得分:0)

我建议使用此功能http://php.net/manual/de/function.imagettfbbox.php

<?php
$white = imagecolorallocate($background, 255, 255, 255);
$fontfile = "davidtr.ttf";
//text how it should be displayed
$string = "מחלדגכ"; //will result in:
                    //  -------------------
                    // |            מחלדגכ|
                    // |                  |
                    // |                  |
                    //  -------------------
$helper = imageTTFBbox(12,0,$fontfile,$string);
imagettftext($background, 12, 0, 15+imagesx($background)-abs($helper[4] - $helper[0]), 17, $white, $fontfile, $string);
?>

所以基本上你计算文本的宽度,得到图像的宽度,减去它们并添加填充(15)。请注意,imageTTFBbox和imagettftext的text,fontfile,fontsize和angle必须相同才能工作

如果您还需要撤消文本,我会推荐@Master_ex

的解决方案

(代码尚未测试。请注释,如果这不起作用,我可以测试它,当然,更正代码)

答案 3 :(得分:0)

这将对您有所帮助:

<?php
$s = iconv("ISO-8859-8", "UTF-8", hebrev(iconv("UTF-8", "ISO-8859-8", $s)));
?>

答案 4 :(得分:-3)

最简单的方法可能就是在PHP方面根本不这样做。我建议您查看http://www.codekhan.com/2012/01/how-to-use-bdo-tag-in-html5.html,看看它是否能满足您的需求。

在HTML方面,您可以在rtl块中包含您的希伯来语文本(如链接中所示),而无需转换页面上的实际LTR数据或其他文本。