2

我有来自数据库的以下字符串: Let's Get Functional

如果我通过 strlen 运行它,它会返回 25 个字符而不是预期的 20 个字符。var 转储显示字符串看起来像上面那样(没有 html 引用等)。

如果我删除单引号 strlen 返回 19 个字符。

显然,报价返回 5 个字符而不是 1 - 为什么?我怎样才能阻止这个?

谢谢!

4

5 回答 5

4

ASCII实体名称为'for ,'等于 5 个字符:ASCII 表

问题似乎与您'被评估的事实有关,而不仅仅是阅读。试着让你的字符串像这样:

$myString = 'Hello World!';

不像这样:

$myString = "Hello World!";

它读取并评估所有字符串的内容,而不仅仅是读取,因此将您的特殊字符解释为它们的ASCII代码。

PHP手册说:如果字符串用双引号(“)括起来,PHP将为特殊字符解释更多的转义序列

我认为你的strlen()函数是用包含的参数调用的",所以它给出了评估的strlen(),而不是读取的。

试试这个 :

$countChars = strlen(utf8_decode($myString));

utf8_decode() 将不在 ISO-8859-1 中的字符转换为“?”,出于计数的目的,这完全可以。

查看内容以获取有关单引号和双引号之间差异的更多信息。

于 2013-09-26T10:00:15.717 回答
2

它不可能是。

<?php
$str = "Let's Get Functional";
echo strlen($str), "\n"; // 20

看看这里的代码输出。

如何调试?

打印每个字符的 ASCII 码:

$str = "Let's Get Functional";
$len = strlen($str);
for ($i = 0; $i < $len; $i++)
{
    echo "$i\t", ord($str[$i]), "\n";
}

这是结果:

0   L       76
1   e       101
2   t       116
3   '       39
4   s       115
5           32
6   G       71
7   e       101
8   t       116
9           32
10  F       70
11  u       117
12  n       110
13  c       99
14  t       116
15  i       105
16  o       111
17  n       110
18  a       97
19  l       108
于 2013-09-26T09:52:01.597 回答
2

正如@deformhead 已经解释的那样,您的撇号似乎已转换为 HTML&apos;字符串。我的猜测是,在将字符串从数据库中取出并在其上调用 strlen() 之间,您会在中间的某个地方调用 htmlentities()。

您还可以使用 CHAR_LENGTH() (MySQL) 在选择查询中检查从数据库中获得的字符数。

您可能会考虑的另一个问题是 strlen() 不适用于多字节字符,因此如果您将使用非 ASCII 字符,那么您最好使用正确编码的 mb_strlen()。但是,这种情况无法解释结果中 5 个字符的差异(strlen() 计算字节数而不是字符串中的字符)。

希望有帮助。

于 2013-09-26T10:17:05.310 回答
0
<?php

$string = "Let's Get Functional";

echo strlen($string);

?>

此代码返回 20 个字符。

于 2013-09-26T09:53:13.510 回答
0

我和你有同样的问题,可能这会对某人有所帮助。

单引号被转换为“'” 这给了我不正确的结果。简单地用单引号替换字符串就解决了我的问题。

$string = "让我们变得实用"; //来自POST或数据库的字符串

回声 strlen($string); //25

$string = str_replace("'", "'",$string); 回声 strlen($string); //20

于 2016-08-19T16:20:22.163 回答