我有这段代码:
$string = 'علی';
echo strlen($string);
由于$string
有 3 波斯字符,输出必须 3 ,但我得 6 。
علی
有3个字符。为什么我的输出 6 ?
如何在php中使用strlen()
来获得具有实际输出的波斯语?
答案 0 :(得分:14)
使用 mb_strlen
返回字符串str中具有字符编码(第二个参数)编码的字符数。多字节字符计为1.
由于您的3个字符都是多字节的,因此strlen
会返回6个字符,但会按预期返回3
。
echo mb_strlen($string,'utf-8');
<强> Fiddle 强>
注意强>
重要的是不要低估这种方法和任何类似替代方案的力量。例如,如果字符是多字节,则可以倾向于说好,然后只用strlen
得到长度并将其除以2,但这只有在字符串的所有字符都是多字节甚至是句点.
将使计数无效。例如这个
echo mb_strlen('علی.','utf-8');
返回正确的4
。所以这个函数不仅取整个长度除以2,每个多字节字符计数1,每个单字节字符计1个。
<强>注2:强>
看起来您决定不使用此方法,因为默认情况下,旧版PHP版本未启用mbstring
扩展名,您可能决定不尝试启用它:)但对于未来的读者来说,并不困难如果您处理多字节字符,则建议启用它,因为它不仅是您可能需要处理的长度。的 See Manual 强>
答案 1 :(得分:7)
试试这个:
function ustrlen($text)
{
if(function_exists('mb_strlen'))
return mb_strlen( $text , 'utf-8' );
return count(preg_split('//u', $text)) - 2;
}
它适用于任何php版本。
答案 2 :(得分:5)
mb_strlen
功能是你的朋友
答案 3 :(得分:4)
$string = 'علی';
echo mb_strlen($string, 'utf8');
答案 4 :(得分:0)
从PHP5开始,可以使用iconv_strlen()
(如php.net中所述,它返回字符串的字符数,因此它可能是最佳选择):
iconv_strlen("علی");
// 3
根据chernyshevsky@hotmail.com的this answer,你可以试试这个:
function string_length (string $string) : int {
return strlen(utf8_decode($string));
}
string_length("علی");
// 3
另外,正如其他人回答的那样,您可以使用mb_strlen()
:
mb_strlen("علی");
// 3
它们之间的区别很小(对于非法的拉丁字符):
iconv_strlen("a\xCC\r"); // A notice
string_length("a\xCC\r"); // 3
mb_strlen("a\xCC\r"); // 2
性能:mb_strlen()是最快的。总的来说,iconv_strlen()和string_length()在性能上没有区别。但令人惊讶的是,mb_strlen()速度快了大约9倍(正如我测试的那样)!
注意:添加回声&#39;每个语句输出它们! ;)