我有一个包含此内容的字符串:
$myString = 'Câmara de Dirigentes Lojistas';
此字符串有29个字符。但是当我打电话给strlen时,它返回30!即使当我打电话给var_dump($myString)
时,也是如此:
114:string 'Câmara de Dirigentes Lojistas' (length=30)
这是怎么回事?也许问题与特殊字符â
有关?
答案 0 :(得分:4)
这是正确的行为,因为您使用的是UTF-8编码。
请在strlen()
documentation上查看此注释
注意:
strlen()返回字节数,而不是字符串中的字符数。
由于您的字符串包含多字节字符(â),因此PHP使用两个字节来表示它。
要具有正确的字符串长度,必须使用mb_strlen()
函数:
mb_strlen("â"); // 1
strlen("â"); // 2
答案 1 :(得分:3)
一个字符串的“长度”有几种定义,因为存在各种各样的技巧来表示全世界使用的各种重音字符,变体和非字母脚本。
strlen
和大多数PHP函数都可以使用。é
视为2个“字符”特别有用仅仅因为它带有一个变音符号。在PHP中,您可以使用mb_strlen
进行计数,告诉它您字符串的字符编码。grapheme_strlen
。答案 2 :(得分:1)
字符â
存在问题,因为它是使用不同编码的特殊字符。这样的字符实际上是双字符,这就是为什么它给出30而不是29
要解决此问题,您需要使用mb_strlen()
进行编码
$myString = 'Câmara de Dirigentes Lojistas';
echo mb_strlen($myString,'utf8')
注意:如果未定义mb_strlen
,则必须在PHP设置中启用mb
扩展名
答案 3 :(得分:-1)
有趣的是,â
字符存在于扩展的ascii中,即,它只能由一个字节表示,您可以使用以下代码进行尝试:
$str = utf8_decode('Câmara de Dirigentes Lojistas');
echo 'length is ' . strlen($str);
将输出length is 29
。
因此,您所看到的是,当一个char不是普通的ascii(127个char ascii表)时,PHP会自动采用UTF-8。