function LENU(str) {
var length = 0, i, c;
for (i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c < 0xDC00 || c > 0xDFFF) {
/* Count everything except low surrogates, as they always
* (in valid UTF-16, at least) follow a high surrogate that
* just got counted previously. */
length++;
}
}
return length;
}
我找不到这样的内置函数,但是 LEN() 的结果是“正确的”,因为它会询问您的浏览器字符串的长度并返回 6,因为浏览器的答案
"?A?B".length
也是 6。尽管 Google 电子表格适用于Unicode,但它实际上不适用于 UTF-8——它适用于 JavaScript 提供的 UTF-16 字符串,并且因为
?
(U+1F94E) 的代码点高于 U+FFFF,它不适合单个 16 位代码单元,但必须存储为代理对(U+D83E U+DD4E)。因此,四字符字符串不是存储为四个 UTF-8 符文,而是存储为六个 UTF-16 代码单元:不幸的是,UTF-16 代码单元正是 JavaScript 中的String.length方法所计算的(这是一个不幸的怪癖,随着世界从严格的 16 位 UCS- 2 到 UTF-16)。如果你
"?A?B".length
在任何 JS 控制台中运行,它也会返回 6。(还有另一个函数
LENB()
将字符串编码为 UTF-8并以字节为单位返回其长度,但这并没有多大帮助。)如果您能够使用Apps Script,则应该可以编写一个自定义函数来执行此操作(尽管没有使用 MDN 中的示例,因为 Apps Script 运行的是不支持字符串作为可迭代对象的旧 JavaScript 版本)。例如:
(注意:仔细检查字符代码范围,不要像我刚才那样不小心输入了 0xDB00。)
这应该可以
=LENU(...)
在电子表格中使用,尽管由于调用了对应用程序的远程调用,它有点慢。