我想要的是计算插入符号从字符串的开头到结尾的移动时间。
说明:
在这个小提琴中查看此字符串""
: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 - 它只是为了好玩
答案 0 :(得分:2)
问题“?”中的字符是 Unicode Character 'LANGUAGE TAG' (U+E0001)
来自以下Stack Overflow问题,
我们了解到
JavaScript strings are UCS-2 encoded但可以使用两个16位数字表示基本多语言窗格(
U+0000
-U+D7FF
和U+E000
-U+FFFF
)之外的Unicode代码点(一个UTF-16代理对),其中第一个必须在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 强>
答案 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
它的价值