我想要的是计算插入符从字符串的开头移动到结尾的时间。
解释:
看这个字符串 ""
在这个 fiddle 中: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-这只是为了好玩
最佳答案
你问题中的字符“₩”是 Unicode Character 'LANGUAGE TAG' (U+E0001) .
从以下 Stack Overflow 问题中,
- "Expressing UTF-16 unicode characters in JavaScript "
- "How can I tell if a string contains multibyte characters in Javascript? "
我们了解到
JavaScript strings are UCS-2 encoded but can represent Unicode code points outside the Basic Multilingual Pane (
U+0000
-U+D7FF
andU+E000
-U+FFFF
) using two 16 bit numbers (a UTF-16 surrogate pair), the first of which must be in the rangeU+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
关于javascript - 计算字符串的实际长度,就像我们使用插入符一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11276497/