我有来自数据库的以下字符串: Let's Get Functional
如果我通过 strlen 运行它,它会返回 25 个字符而不是预期的 20 个字符。var 转储显示字符串看起来像上面那样(没有 html 引用等)。
如果我删除单引号 strlen 返回 19 个字符。
显然,报价返回 5 个字符而不是 1 - 为什么?我怎样才能阻止这个?
谢谢!
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 中的字符转换为“?”,出于计数的目的,这完全可以。
查看此内容以获取有关单引号和双引号之间差异的更多信息。
它不可能是。
<?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
正如@deformhead 已经解释的那样,您的撇号似乎已转换为 HTML'
字符串。我的猜测是,在将字符串从数据库中取出并在其上调用 strlen() 之间,您会在中间的某个地方调用 htmlentities()。
您还可以使用 CHAR_LENGTH() (MySQL) 在选择查询中检查从数据库中获得的字符数。
您可能会考虑的另一个问题是 strlen() 不适用于多字节字符,因此如果您将使用非 ASCII 字符,那么您最好使用正确编码的 mb_strlen()。但是,这种情况无法解释结果中 5 个字符的差异(strlen() 计算字节数而不是字符串中的字符)。
希望有帮助。
<?php
$string = "Let's Get Functional";
echo strlen($string);
?>
此代码返回 20 个字符。
我和你有同样的问题,可能这会对某人有所帮助。
单引号被转换为“'” 这给了我不正确的结果。简单地用单引号替换字符串就解决了我的问题。
$string = "让我们变得实用"; //来自POST或数据库的字符串
回声 strlen($string); //25
$string = str_replace("'", "'",$string); 回声 strlen($string); //20