【问题标题】:Javascript String Length Differs From PHP mb_strlenJavascript 字符串长度与 PHP mb_strlen 不同
【发布时间】:2010-03-20 12:00:16
【问题描述】:

我使用document.getElementById("text").value.length通过javascript获取字符串长度,mb_strlen($_POST['text'])通过PHP获取字符串长度,两者差别很大。在获取字符串长度之前,回车在 javascript 中进行了转换,但我猜有些字符没有被计算在内。

例如,

[b]15。 Umieszczanie obrazka z logo na stronie zespołu[/b]

此文本块在 javascript 中计算为 57,在 PHP 中计算为 58。当文本变长时,差异会增加。有什么办法可以克服吗?

【问题讨论】:

  • 你在 JavaScript 端使用什么编码?
  • 你能举一个比一个更多不同的例子吗(这可能归结为计算换行符或其他什么)?想必你用的ł这样的特殊字符越多,差距就会越拉越大。
  • 您是否尝试过使用可选的第二个参数来指定编码?我假设你已经将样本转录给我们 ascii 并且真正的字符串不是。
  • 指定编码的可选第二个参数是什么?
  • 哦,是的,我使用的是 UTF-8 编码。有没有一种特殊的方法来计算它的字符串长度?

标签: php javascript


【解决方案1】:

如果你想在 PHP 中获取 UTF-8 编码字符串的长度,你应该在 mb_strlen 的第二个参数中指定编码,如下所示:

mb_strlen($_POST['text'], 'UTF-8')

另外,不要忘记在 POST-var 上调用 stripslashes

【讨论】:

    【解决方案2】:

    我找到了一个 mb_strlen 等效的 Javascript 函数,也许这对其他人有用:

    function mb_strlen(str) {
        var len = 0;
        for(var i = 0; i < str.length; i++) {
            len += str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255 ? 2 : 1;
        }
        return len;
    }
    

    感谢所有试图提供帮助的人!

    【讨论】:

    • 谁知道多字节字符是用 3 个字节编码的?!第一次听说..
    • @PP 这当然是不正确的,并且该函数仅适用于 0-127 范围内的字符或不适合两个字符集的字符混合。我真的认为@TheOnly92 应该解决它。
    • @TheOnly92:所有需要两个字节来表示为 UTF-8 的字符将占用两个字节,所有需要三个字节的将占用三个字节,而那些占用四个字节的将占用四个字节,等等等。不过,2 到 3 之间的限制应该远高于 2048。
    • @Fredrik 那么,您有什么建议可以让功能更完善?
    • @TheOnly92 您要么需要进行正确的 UTF-8 解码并计算字节数,要么根本不应该这样做,因为 javascript 已经为您正确计算了长度。如果您希望 php 中的长度正确,您应该使用正确的参数调用 mb_strlen(),就像您已经得到解释的答案一样。
    【解决方案3】:

    我注意到其中有一个非标准字符(ł)——我不确定 PHP 如何计算非标准字符——但它可能会将其计为两个。如果您在没有该字符的情况下运行测试会发生什么?

    【讨论】:

    • 如果不准确,我已经怀疑是编码的问题了... Javascript有没有等价的功能?
    • @TheOnly92,你为什么要修复它,它已经正确了?告诉 PHP 端它应该如何正确计算长度不是更好吗(请参阅 Matthew 对您的问题的评论)。
    • 事实上,我认为我的数据库存储排序规则没有考虑 utf8,它将这些字符长度计为 2...
    【解决方案4】:

    这应该可以解决问题

    function mb_strlen (s) {
      return ~-encodeURI(s).split(/%..|./).length;
    }
    

    【讨论】:

      【解决方案5】:

      只需在文本区域中输入多于一行,您就会发现差异越来越大... 这是因为当所有 PHP 长度函数都将它们考虑在内时,Javascript value.length 不计算行尾。 做吧:

      // In case you're using CKEditot
      // id is the id of the text area
      var value = eval('CKEDITOR.instances.'+id+'.getData();');
      
      // String length without the CRLF   
      var taille = value.length;
      
      // get number of line
      var nb_lines = (value.match(/\n/g) || []).length;
      
      // Now, this value is the same you'll get with strlen in PHP
      taille = taille + nb_lines;
      

      【讨论】:

        猜你喜欢
        • 2011-11-30
        • 2014-07-22
        • 2019-12-17
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        相关资源
        最近更新 更多