Strlen没有返回正确的字符串长度

时间:2018-11-27 18:08:55

标签: php

我有一个包含此内容的字符串:

$myString = 'Câmara de Dirigentes Lojistas';

此字符串有29个字符。但是当我打电话给strlen时,它返回30!即使当我打电话给var_dump($myString)时,也是如此:

114:string 'Câmara de Dirigentes Lojistas' (length=30)

这是怎么回事?也许问题与特殊字符â有关?

4 个答案:

答案 0 :(得分:4)

这是正确的行为,因为您使用的是UTF-8编码。

请在strlen() documentation上查看此注释

  

注意:

     

strlen()返回字节数,而不是字符串中的字符数。

由于您的字符串包含多字节字符(â),因此PHP使用两个字节来表示它。

要具有正确的字符串长度,必须使用mb_strlen()函数:

mb_strlen("â"); // 1

strlen("â");    // 2

答案 1 :(得分:3)

一个字符串的“长度”有几种定义,因为存在各种各样的技巧来表示全世界使用的各种重音字符,变体和非字母脚本。

  • 字符串占用的字节数。这是最容易计算的,但并非总是预期的。例如,在UTF-16中,每个代码点占用2或4个字节。在UTF-8中,代码点占用1、2、3或4个字节。 strlen和大多数PHP函数都可以使用。
  • “代码点”的数量:字符集中的单独符号。这是下一个最简单的方法,也是下一个最常见的方法,但是通常是字节和“字素”之间的折衷(见下文)-在很多情况下,将é视为2个“字符”特别有用仅仅因为它带有一个变音符号。在PHP中,您可以使用mb_strlen进行计数,告诉它您字符串的字符编码。
  • “字素”的数量:读者可以识别的单独符号。这是最直观的含义,但计算机很难定义。在PHP中,只要确保您的字符串编码为UTF-8,就可以使用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。