我试图让这个Unicode字符字符串的长度的strlen()PHP函数给出的Unicode字符长度错误
$text = 'نام سلطان م';
$length = strlen($text);
echo $length;
输出
20
它是如何决定的Unicode字符长度串?
我试图让这个Unicode字符字符串的长度的strlen()PHP函数给出的Unicode字符长度错误
$text = 'نام سلطان م';
$length = strlen($text);
echo $length;
输出
20
它是如何决定的Unicode字符长度串?
strlen()
没有正确处理多字节字符,因为它假设1个字符等于1个字节,这对于unicode来说简直是无效的。这种行为被记录在这里:http://php.net/strlen
的strlen()返回字节数的,而不是数字符串中的字符的。
解决方案是使用mb_strlen()
函数代替(mb
代表multi byte
)(see mb_strlen() docs)。
EDIT
如果出于任何变化代码的原因是不可能的/可行的,人们可能想要确保的字符串功能由多字节对应自动过载。这由PHP和documented here支持。
请注意,您可能还想编辑您的php.ini
以确保mb_string按您的需要工作。可用的设置是documented here。
您正在寻找mb_strlen
。
函数strlnen
不计算字符数,而是计算字节数。对于多字节字符,它将返回更高的数字。
改为使用mb_strlen()
来计算字符的实际数量。
只是作为附录引用mb_strlen()
其他答案:
如果php.in
设置mbstring.func_overload
有2位设置为1,则strlen
将计算基于默认字符集字符;否则会计算字符串中个字节的个数
我想知道,分离unicode /非unicode函数的具体点是什么?为什么不总是使用'(mb_)'函数? – 2014-12-25 09:06:41
不久之后 - 这是因为PHP设计(如语言)在很多地方都很糟糕,这也包括UTF8的支持。 PHP在内部不支持多字节编码多年,这就是为什么创建多字节扩展的原因。你可以通过函数重载来自动使用'mb_' - >参见http://php.net/manual/en/mbstring.overload.php,但这取决于PHP配置,所以有时候直接使用'mb_ '如果你不能确保它会以其他方式使用。 – 2014-12-25 09:51:22
感谢您的解释,我的朋友,特别是指着'过载',完全错过了..干杯! – 2014-12-26 14:51:43