Javascript字符串长度与PHP mb_strlen不同

时间:2010-03-20 12:00:17

标签: php javascript

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

例如,

  

并[b] 15。 Umieszczanie obrazka z logo nastroniezespołu[/ b]

这个文本块在javascript中计算57,在PHP中计算58。当文本变长时,差异会增加。有没有办法克服这个问题?

5 个答案:

答案 0 :(得分:4)

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

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

另外,不要忘记在POST-var。

上调用stripslashes

答案 1 :(得分:2)

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

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;
}

感谢所有想要帮助的人!

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这应该可以解决问题

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

答案 4 :(得分:0)

只需在您的文本区域输入多于一行,您就会看到差异越来越大... 这是因为当所有 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;