【问题标题】:Calculate real length of a string, like we do with the caret计算字符串的实际长度,就像我们使用插入符号一样
【发布时间】:2012-06-30 18:17:42
【问题描述】:

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

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

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

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

我怎样才能得到 1?


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

【问题讨论】:

  • 返回的长度加一?
  • 您实际上想要完成什么?知道这可能会很有用。您是否要跟踪从左到右爬行的光标以检测或操作某些内容?
  • 另外,您能否在 jsFiddle 以外的地方演示这种效果,这是一种独特的编辑环境?换句话说,普通的input 和textarea 没有这个效果。 jsFiddle 的文本操作脚本没有完美调整。
  • @JaredFarrish 如果用户按下箭头来计算文本框中的长度,他将得到x。在大多数情况下 ("foo",123,ಠ_ಠ) length 会给出 x。但在我的例子中不是。
  • 见我的第二条评论。您还有其他地方可以证明这不是 jsFiddle 吗?必须使用哪种“基于光标”的环境?

标签: javascript string-length


【解决方案1】:

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

来自以下 Stack Overflow 问题,

我们知道

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

代表“?”的UTF-16 surrogate pair是U+DB40和U+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

【讨论】:

    【解决方案2】:
    function realLength(str) {
        var i = 1;
        while (str.substring(i,i+1) != "") i++;
        return (i-1);
    }
    

    没有尝试代码,但我认为它应该可以工作。

    【讨论】:

    • 在光标上接受幽灵拖曳的前提下,"2" 在第一个 " 之后仍然存在问题(在 Firefox 中)。
    • @user1493235 抱歉,它不起作用,它只会返回&lt;string&gt;.length-1 看看这个jsfiddle.net/zDwPu(并用你的插入符号测试实际长度)
    • 这个解决方案很慢(.substring(i,i+1) 而不是[i])、错误(var i = 1;)而且没用(不是问题的答案)。
    • 没有对“没有尝试代码,但我认为它应该可以工作”投反对票。 ?
    【解决方案3】:

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

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

    物有所值

    【讨论】:

    • 你确定uDFFF是极限吗?
    • 我不是很明白。限制是\uFFFF 还是\uDFFF?我应该使用什么?为什么?谢谢。
    • 你到底有什么不明白的?写的是uDFFF,还有什么其他限制?可能更正确的表达方式是yourstring.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, "0").length,但谁在乎,真的……
    • panda-34,今天有人踩到你的生日蛋糕了吗? Lil' 悲观很多?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2012-01-31
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    相关资源
    最近更新 更多