为什么PHP strlen()和Javascript xxx.length不相等?

时间:2018-01-15 11:24:01

标签: javascript php

我有以下文字:

  

甲龙是一种装甲恐龙,大约有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个字符,为什么?

3 个答案:

答案 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。