什么是JavaScript字符串的安全长度?

时间:2017-03-10 02:02:55

标签: javascript arrays utf-8 utf-16

考虑codePointAt()lengthi,我发现参数含义之间存在差异。在我真正想到它之前,我认为你可以安全地访问i+1 - 1处的角色。但我读到charCodeAt()和codePointAt()之间的区别是charCodeAt()是指16位(字节对)所以除了阅读length之外,如果它们是代理对,你还需要length(和UTF-16的方法一样。而codePointAt()需要一个引用UTF-8字符位置的参数(基于零)。所以现在我陷入困境,codePointAt()是否计算字符数或UTF-16字节对的数量。我相信JavaScript将字符串保存为UTF-16,但是对于具有if ($stmt->execute()) { return "TRUE"; } else { return "FALSE"; } 函数的大量4字节字符的字符串,使用$statreset = $user->resetpassword($upass,$tokenrecover,$usermail); echo $statreset; if ($statreset =="TRUE"){ echo "query done"; } - 1将不在字符串的末尾!

2 个答案:

答案 0 :(得分:3)

lengthstrings计入 16位无符号整数值(“元素”)代码单元(它们一起形成)一个有效或无效的UTF16代码单元序列),它的索引也是如此。我们也可能称它们为“人物”。

无论您是访问它们as properties还是通过charAtchatCodeAtcodePointAtlength - 1始终是有效索引。但是,代码点可以编码为跨越两个索引的代理对。没有内置方法来测量它们的数量,但默认字符串迭代器将产生它们,因此您可以使用for … of循环来计算它们。

答案 1 :(得分:2)

使用[...str].length作为字符数。

var mb = "";
console.log(mb.length);
console.log([...mb].length); // "real" length (ES6)
console.log(mb.charAt(0)); // The first two byte
console.log(mb.codePointAt(0)); // The first two byte
console.log(mb.codePointAt(1)); // The second two byte
console.log(mb.charCodeAt(0)); // The four bytes combined (ES6)
console.log(mb.charCodeAt(1)); // The second two byte (ES6)