【问题标题】:What is a safe length of JavaScript strings?JavaScript 字符串的安全长度是多少?
【发布时间】:2017-03-10 02:02:54
【问题描述】:

考虑到charAt()charCodeAt()codePointAt(),我发现参数含义之间存在差异。在我真正考虑之前,我认为您始终可以安全地访问length-1 的角色。但是我读到 charCodeAt() 和 codePointAt() 之间的区别在于 charCodeAt() 指的是 16 位(字节对),所以除了阅读 i 之外,如果它们是代理对,您还需要 i+1(方法也是如此)使用 UTF-16)。而 codePointAt() 需要一个引用 UTF-8 字符位置的参数(从零开始)。所以现在我很困惑length 是计算字符数还是UTF-16 样式的字节对数。我相信 JavaScript 将字符串保存为 UTF-16,但是使用 length-1 来自具有大量 4 字节字符的字符串和 codePointAt() 函数将不在字符串的末尾!!

【问题讨论】:

  • 字符串可以是任意长度,只要有足够的内存。

标签: javascript arrays utf-8 utf-16


【解决方案1】:

stringslength16 位无符号整数值(“元素”)代码单元 (它们一起构成有效或无效UTF16 代码单元序列),其索引也是如此。我们也可以称它们为“字符”。

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

【讨论】:

  • 请为OP的问题“安全长度是多少”提出一个解决方案。
  • 感谢您的回答。非常失望,尽管 JavaScript 是如此无用,以至于如果您碰巧为它提供了第二个代理对的索引,它可能会提供非法的返回值。
  • @Clive “非法”是什么意思?它只是那个索引处的代码单元,不管它前面可能有什么字节。但是,是的,JavaScript 字符串是不可变的 Uint16Arrays 而不是 Unicode 字符列表。
  • @Bergi 我称它为非法,因为所有 3 个函数名称中的子字符串 'char'。通过他们的名字,他们声称给出“字符”的代码,而不是 16 位无符号整数值的代码。
  • @Bergi。 “不顾一切” - 哇,那是丛林主义吗? (如“被误解”)呵呵
【解决方案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)

【讨论】:

  • 我假设您的 mb 字符集是一个非基本的多语言平面字符。感谢您的回答和包含的来源。但是我对 JavaScript 的 length 属性感到失望,它似乎根本没有说明有多少个字符。我不知道省略号。
  • 我建议使用Array.from(…) 将可迭代对象转换为数组,展开语法只能用作文字的一部分。
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2011-12-01
  • 2012-08-27
  • 1970-01-01
相关资源
最近更新 更多