2013-04-05 37 views

回答

19

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

+0

我想知道,分离unicode /非unicode函数的具体点是什么?为什么不总是使用'(mb_)'函数? – 2014-12-25 09:06:41

+1

不久之后 - 这是因为PHP设计(如语言)在很多地方都很糟糕,这也包括UTF8的支持。 PHP在内部不支持多字节编码多年,这就是为什么创建多字节扩展的原因。你可以通过函数重载来自动使用'mb_' - >参见http://php.net/manual/en/mbstring.overload.php,但这取决于PHP配置,所以有时候直接使用'mb_ '如果你不能确保它会以其他方式使用。 – 2014-12-25 09:51:22

+0

感谢您的解释,我的朋友,特别是指着'过载',完全错过了..干杯! – 2014-12-26 14:51:43

0

函数strlnen不计算字符数,而是计算字节数。对于多字节字符,它将返回更高的数字。
改为使用mb_strlen()来计算字符的实际数量。

0

只是作为附录引用mb_strlen()其他答案:

如果php.in设置mbstring.func_overload有2位设置为1,则strlen将计算基于默认字符集字符;否则会计算字符串中个字节的个数

相关问题