计算字符串的实际长度,就像我们使用插入符一样

时间:2012-06-30 18:17:42

标签: javascript string-length

我想要的是计算插入符号从字符串的开头到结尾的移动时间。

说明:
在这个小提琴中查看此字符串""http://jsfiddle.net/RFuQ3/
如果你把插入符号放在第一个引号之前然后按右箭头你将按3次推送到第二个引号后(而不是2次为空字符串)。

第一种方式,最容易计算字符串的长度是<string>.length 但在这里,它返回2.

第二种方式,来自JavaScript Get real length of a string (without entities)也给出了2。

我如何获得1?


1 - 我想方法将字符串放入文本输入中,然后使用while进行try{setCaret}catch(){}循环
2 - 它只是为了好玩

3 个答案:

答案 0 :(得分:2)

问题“?”中的字符是 Unicode Character 'LANGUAGE TAG' (U+E0001)

来自以下Stack Overflow问题,

我们了解到

  

JavaScript strings are UCS-2 encoded但可以使用两个16位数字表示基本多语言窗格(U+0000 - U+D7FFU+E000 - U+FFFF)之外的Unicode代码点(一个UTF-16代理对),其中第一个必须在U+D800 - U+DFFF范围内。

代表“?”的UTF-16 surrogate pairU+DB40U+DC01。小数U+DB40为56128,U+DC01为56321。

console.log("".length); // 2
console.log("".charCodeAt(0)); // 56128
console.log("".charCodeAt(1)); // 56321
console.log("\uDB40\uDC01" === ""); // true
console.log(String.fromCharCode(0xDB40, 0xDC01) === ""); // true

调整https://stackoverflow.com/a/4885062/788324的代码,我们只需计算代码点的数量即可得出正确的答案:

var getNumCodePoints = function(str) {
    var numCodePoints = 0;
    for (var i = 0; i < str.length; i++) {
        var charCode = str.charCodeAt(i);
        if ((charCode & 0xF800) == 0xD800) {
            i++;
        }
        numCodePoints++;
    }
    return numCodePoints;
};

console.log(getNumCodePoints("")); // 1

<强> jsFiddle Demo

答案 1 :(得分:0)

function realLength(str) {
    var i = 1;
    while (str.substring(i,i+1) != "") i++;
    return (i-1);
}

没有尝试过代码,但我觉得应该可行。

答案 2 :(得分:0)

Javascript并不真正支持unicode。 你可以尝试

yourstring.replace(/[\uD800-\uDFFF]{2}/g, "0").length

它的价值