我有以下文字:
甲龙是一种装甲恐龙,大约有6700万 几年前,在白垩纪末期。这个属是 在最后一只非鸟类恐龙中,生活在一起 霸王龙,三角龙和埃德蒙顿龙。它的名字意思是'融合的 蜥蜴';头骨和身体其他部位的骨头融合在一起, 增加他们的力量。甲龙高达6.25米(20.5英尺) 长1.7米(5.6英尺),重约4.8-8吨 (11,000-18,000磅)。它有一个宽阔,坚固的身体,宽阔,低矮 头骨。钳口的前部被喙覆盖,有排 在它后面的小的叶状牙齿,适合草食性饮食。 它被防护罩覆盖在防护板上 覆盖脖子的骨质半环,最后有一个大俱乐部 它的尾巴可能被用作武器。来自少数的化石 在各种地质中发现了甲龙的标本 北美西部的地层,但完整的骨架
现在我运行PHP和JS代码:
echo strlen(trim($text));
和
var text = "above text";
alert( text.length);
现在PHP显示1004,JS显示1000个字符,为什么?
答案 0 :(得分:2)
你的两个版本不太可能打印相同的输出,因为它们做了不同的事情。
JavaScript's String.length
property返回字符数(虽然基于早期和过时的字符定义):
console.log(`–`.length);
console.log(``.length);

PHP's strlen()
function返回一个字节数,你可能正在使用像UTF-8这样的多字节编码(或者你应该)。请比较:
var_dump(strlen('–'), mb_strlen('–'));
var_dump(strlen(''), mb_strlen(''));
int(3)
int(1)
int(4)
int(1)
您还只在JavaScript版本中删除了前导空格和尾随空格,空格也是人。
构建可靠的字符数跨语言函数:
PHP:mb_strlen()应该可以正常工作,只要您配置应用程序告诉PHP有关正在使用的编码(或每次手动指定编码)并且您正确地提供它编码数据。在2018年,通常没有理由使用除UTF-8以外的任何东西。
var_dump(mb_strlen('–', 'UTF-8'));
JavaScript String.length如果您认为自己不需要考虑表情符号似乎适合您,但为了安全起见,您可以查看JavaScript has a Unicode problem对于一些变通方法(即使是纯粹的学习目的,这篇文章也很有趣)。
答案 1 :(得分:0)
这是因为您使用的不是以下行4.8–8 tonnes (11,000–18,000 lb)
中的常规短划线。这个字符使用3个字节(你使用它两次,所以它是6而不是2个长度)。
要防止您使用mb_strlen($string)
或使用–
更改-
。
我建议使用mb_
变体,这样你不仅可以安全地使用未来,而且也不会删除可能的Typo(如果这个“破折号”实际上是正确的破折号...那么如果这符合您的利益,那么很多https://typefacts.com会帮助你很多。
答案 2 :(得分:0)
Ascii 字符的长度为 1 个字节。 strlen 函数假定每个字符的长度为 1 个字节,这对于英语来说很有效。
但是当您开始处理非英语语言时,字符可能需要 1 个以上的字节来表示。如果超过 1 个字节应使用 mb_strlen。