在javascript字符串中获取字形字符数?

Ang*_*gus 4 javascript unicode grapheme

我试图在用户可见的字形中获取javascript字符串的长度,即忽略组合字符(和代理对?).这是可能的,如果是的话,我该怎么做呢?

我们在项目中使用了dojo工具包,但任何通用的JavaScript解决方案都会很棒.

Rún*_*erg 9

使用Intl.Segmenter

\n
\n

Intl.Segmenter对象支持区域设置敏感的文本分段,使您能够从字符串中获取有意义的项目(字素、单词或句子)。

\n
\n
[...new Intl.Segmenter().segment(\'\xef\xb8\x8f\xe2\x80\x8d\xe2\x9a\xa7\xef\xb8\x8f\xef\xb8\x8f\xe2\x80\x8d\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d\')].length;\n//=> 3\n\n"\xef\xb8\x8f\xe2\x80\x8d\xe2\x9a\xa7\xef\xb8\x8f\xef\xb8\x8f\xe2\x80\x8d\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d".length\n//=> 24\n\n[..."\xef\xb8\x8f\xe2\x80\x8d\xe2\x9a\xa7\xef\xb8\x8f\xef\xb8\x8f\xe2\x80\x8d\xe2\x80\x8d\xe2\x9d\xa4\xef\xb8\x8f\xe2\x80\x8d"].length\n//=> 17\n
Run Code Online (Sandbox Code Playgroud)\n

截至 2023 年 3 月,Intl.Segmenter在 Node、Chrome 和 Safari 中可用,但在 Firefox 中不可用(请参阅可用性表此处提供了 polyfill)。

\n


Orl*_*iev 5

这是一个纯JavaScript库,它可以做到这一点:

https://github.com/orling/grapheme-splitter

它在家庭酿造解决方案中可能会错过的所有边缘情况都实现了Unicode UAX-29标准,例如非拉丁文变音符号,韩文(韩语)jamo字符,表情符号,多个组合标记等.


dda*_*dda 1

对于组合字符,请查看派生组合类,其中列出了所有组合字符(以及其他字符)。因为你只是对计数感兴趣,所以你可以将它们排除掉——让你有一个稍微更接近的估计。

在 Angus 链接的帖子中,BMP 之外的 JavaScript 字符串显示了处理代理项的代码。但该代码实际上与您想要的相反 - 它将 0x10000+ 代码点拆分为两个代码点。就 JS 而言,它只是一个代码点——尽管是一个被截断的代码点。谁在乎?你正在计算它们,而不是显示......

但是,您可能还想处理另一类代码点,即不可打印字符。当然是 0x20 以下的任何值,但还有很多其他值——例如 0x2000 范围。这些也不可见,不应包含在您的计数中。