2015-09-20 43 views
2

我在阿拉伯语像一个字符串:切阿拉伯语串

على احمد يوسف 

现在我需要削减该字符串,并将其输出,如:

...على احمد يو 

我尝试这个功能:

function short_name($str, $limit) { 
    if ($limit < 3) { 
     $limit = 3; 
    } 

    if (strlen($str) > $limit) { 
     if (preg_match('/\p{Arabic}/u', $str)) { 
      return substr($str, 0, $limit - 3) . '...'; 
     } 
     else { 
      return '...'.substr($str, 0, $limit - 3); 
     } 
    } 
    else { 
     return $str; 
    } 
} 

问题是,有时它会在字符串的末尾显示一个像这样的符号:

...�على احمد يو 

为什么会发生这种情况?

回答

1

剪切后显示的符号是substr()在字符中间剪切的结果,导致一个无效的字符。

您需要使用Multibyte String Functions来处理阿拉伯字符串,如mb_strlen()mb_substr()

您还需要确保这些功能的内部编码设置为UTF-8。你可以在你的脚本的顶部全局设置这样的:

mb_internal_encoding('UTF-8'); 

导致此:

  • strlen('على احمد يوسف')回报24,以八位字节大小
  • mb_strlen('على احمد يوسف')回报13,大小中的字符

请注意,如果内部编码仍设置为默认ISO-8859-1,则mb_strlen('على احمد يوسف')也将返回24。

+0

但有些时候我们用英文字母 –

+0

@ Thirty5Seconds UTF-8点工作,无论使用哪个字母的工作。多字节功能也适用于英文。 – spenibus

1

答:

return '...'.mb_substr($str, 0, $limit - 3, "UTF-8"); // UTF-8 is optional 

背景:

在ISO 8859-1阿拉伯语是一个位字符集。 substr()调用在8位字符集上工作的内部libc函数。要显示高于255的字符(阿拉伯语,循环,朝鲜语等),需要显示该字符的位数更多,例如16位或有时甚至是32位。你减去3 * 8位,这将导致UTF-8中某些不可显示的字符。特别是如果您要使用大量多字节字符串,请确保使用正确的字符串函数,如mb_strlen()

+0

阿拉伯字母表有8位字符集,例如,Windows-1256或ISO-8859-6。 – Gumbo

+0

@Gumbo ISO-8859-1是大多数系统的默认设置。如果他会使用另一种编码,那么首先可能没有问题。 –

+0

您的陈述仍然错误/误导。相反,您应该声明在UCS中,阿拉伯字母不在前128个字符内,这是唯一以UTF-8中的单个字节编码的字符。 – Gumbo