Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Strlen未返回正确的字符串长度_Php - Fatal编程技术网

Php Strlen未返回正确的字符串长度

Php Strlen未返回正确的字符串长度,php,Php,我有一个包含以下内容的字符串: $myString = 'Câmara de Dirigentes Lojistas'; 这个字符串有29个字符。但当我给斯特伦打电话时,它返回30!即使我调用var_dump$myString,结果也是这样: 114:string 'Câmara de Dirigentes Lojistas' (length=30) 这是怎么回事?可能问题与特殊字符有关,这是正确的行为,因为您使用的是UTF-8编码 请参阅本页的说明 注: strlen返回字节数,而不是字符

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

$myString = 'Câmara de Dirigentes Lojistas';
这个字符串有29个字符。但当我给斯特伦打电话时,它返回30!即使我调用var_dump$myString,结果也是这样:

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

这是怎么回事?可能问题与特殊字符有关,这是正确的行为,因为您使用的是UTF-8编码

请参阅本页的说明

注:

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

由于字符串具有多字节字符,PHP使用两个字节来表示它

要获得正确的字符串长度,必须使用以下函数:

mb_strlen("â"); // 1

strlen("â");    // 2

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

请参阅本页的说明

注:

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

由于字符串具有多字节字符,PHP使用两个字节来表示它

要获得正确的字符串长度,必须使用以下函数:

mb_strlen("â"); // 1

strlen("â");    // 2

这个字符有一个问题,因为它是一个使用不同编码的特殊字符。像这样的字符实际上是双字符这就是为什么它给出30而不是29

要解决此问题,需要使用mb_strlen进行编码

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

echo mb_strlen($myString,'utf8')

注意:如果mb_strlen未定义,则必须在php设置中启用mb扩展

字符有问题,因为它是一个使用不同编码的特殊字符。像这样的字符实际上是双字符这就是为什么它给出30而不是29

要解决此问题,需要使用mb_strlen进行编码

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

echo mb_strlen($myString,'utf8')
注意:如果mb_strlen未定义,则必须在php设置中启用mb扩展

有趣的是–char存在于扩展ascii中,即它可以仅由一个字节表示,您可以使用以下代码进行尝试:

$str = utf8_decode('Câmara de Dirigentes Lojistas');
echo 'length is ' . strlen($str);
这将输出长度为29

因此,正如您所看到的,当字符不是纯ascii 127字符ascii表时,PHP会自动假定UTF-8。

有趣的是–字符存在于扩展ascii中,即它可以仅由一个字节表示,您可以使用以下代码来尝试:

$str = utf8_decode('Câmara de Dirigentes Lojistas');
echo 'length is ' . strlen($str);
这将输出长度为29


因此,正如您所看到的,当字符不是纯ascii 127字符ascii表时,PHP会自动采用UTF-8。

字符串长度有几种定义,因为有各种技巧用于表示世界各地使用的大量重音字符、变体和非字母脚本

字符串占用的字节数。这是最容易计算的,但并不总是预期的结果。例如,在UTF-16中,每个代码点占用2或4个字节;在UTF-8中,代码点占用1、2、3或4个字节。这就是strlen和大多数PHP函数的工作原理。 代码点数:字符集中的独立符号。这是第二个最简单的,也是第二个最常见的,但通常是字节和图形之间的折衷,见下文-没有多少情况下,仅仅因为用组合变音符号表示而将é计为2个字符特别有用。在PHP中,您可以使用来计算这些值,告诉它您的字符串的字符编码。 字母的数量:读者可以识别的独立符号。这是最直观的含义,但对计算机来说是最难定义的。在PHP中,只要确保字符串编码为UTF-8,就可以使用。
字符串的长度有几种定义,因为有各种各样的技巧用于表示世界各地使用的大量重音字符、变体和非字母脚本

字符串占用的字节数。这是最容易计算的,但并不总是预期的结果。例如,在UTF-16中,每个代码点占用2或4个字节;在UTF-8中,代码点占用1、2、3或4个字节。这就是strlen和大多数PHP函数的工作原理。 代码点数:字符集中的独立符号。这是第二个最简单的,也是第二个最常见的,但通常是字节和图形之间的折衷,见下文-没有多少情况下,仅仅因为用组合变音符号表示而将é计为2个字符特别有用。在PHP中,您可以使用来计算这些值,告诉它您的字符串的字符编码。 字母的数量:读者可以识别的独立符号。这是最直观的含义,但对计算机来说是最难定义的。在PHP中,只要确保字符串编码为UTF-8,就可以使用。
–是两个字节。欢迎使用UTF8,从现在起,基本上使用侧边栏中显示的所有其他mb_u函数。@Sammitch谢谢,这就成功了!–是两个字节。欢迎使用UTF8,从现在起,基本上使用侧边栏中显示的所有其他mb_u函数。@Sammitch谢谢,这就成功了!首先,没有一种编码称为

扩展ASCII码;有几种8位编码是ASCII兼容的,有些编码中可能包含此字符。其次,PHP不一定自动假定UTF-8,这取决于源文件的编码。最后,字符串utf8_decode的名称很糟糕,经常被误用;它假定输入是UTF-8(可能不是),并将其转换为ISO 8859-1,这不是一个特别有用的字符集。您的示例之所以有效,是因为您从一个UTF-8编码文件运行它,并且因为–恰好存在于ISO 8859-1中。@IMSoP肯定有-Nelson谈到重音字母。这里不是我的反对票。@FunkFortyner那篇文章将其用作ASCII兼容编码的同义词,并指出它经常被批评为含糊不清和误导。因为可以有任意数量的字符,所以不可能说扩展ASCII中存在任何特定的非ASCII字符。例如,–肯定不在中,但这符合扩展ASCII的定义。@IMSoP是的,我知道。就我个人而言,我一直认为重音字母是扩展字符集的一部分,只是说:首先,没有一种编码称为扩展ASCII;有几种8位编码是ASCII兼容的,有些编码中可能包含此字符。其次,PHP不一定自动假定UTF-8,这取决于源文件的编码。最后,字符串utf8_decode的名称很糟糕,经常被误用;它假定输入是UTF-8(可能不是),并将其转换为ISO 8859-1,这不是一个特别有用的字符集。您的示例之所以有效,是因为您从一个UTF-8编码文件运行它,并且因为–恰好存在于ISO 8859-1中。@IMSoP肯定有-Nelson谈到重音字母。这里不是我的反对票。@FunkFortyner那篇文章将其用作ASCII兼容编码的同义词,并指出它经常被批评为含糊不清和误导。因为可以有任意数量的字符,所以不可能说扩展ASCII中存在任何特定的非ASCII字符。例如,–肯定不在中,但这符合扩展ASCII的定义。@IMSoP是的,我知道。就我个人而言,我一直在考虑并被证明重音字母是扩展字符集的一部分,只是说。我认为特殊字符和双字符的概念是一种令人困惑的看法。在某些编码中,如UTF-16,所有字符都占用一个以上的字节;在其他情况下,如ISO 8859-15,所有可表示字符只占用一个字节。没有人比其他人更特别。我认为特殊字符和双重字符的概念是一种令人困惑的看待这个问题的方式。在某些编码中,如UTF-16,所有字符都占用一个以上的字节;在其他情况下,如ISO 8859-15,所有可表示字符只占用一个字节。没有一个比其他的更特别。Pendantry:UTF-16有时使用4个字节;此外,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月8月5日日日日日日日方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方Sammitch oops,确实如此@Sammitch 16em@TomBlodget将一美元放入使用过的ems罐中。Pendantry:UTF-16有时使用4个字节;此外,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月,本月8月5日日日日日日日方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方Sammitch oops,确实如此@Sammitch 16em@TomBlodget在用过的ems罐子里放了一美元。