Ang*_*gus 4 javascript unicode grapheme
我试图在用户可见的字形中获取javascript字符串的长度,即忽略组合字符(和代理对?).这是可能的,如果是的话,我该怎么做呢?
我们在项目中使用了dojo工具包,但任何通用的JavaScript解决方案都会很棒.
\n\n该
\nIntl.Segmenter
对象支持区域设置敏感的文本分段,使您能够从字符串中获取有意义的项目(字素、单词或句子)。
[...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)。
这是一个纯JavaScript库,它可以做到这一点:
https://github.com/orling/grapheme-splitter
它在家庭酿造解决方案中可能会错过的所有边缘情况都实现了Unicode UAX-29标准,例如非拉丁文变音符号,韩文(韩语)jamo字符,表情符号,多个组合标记等.
对于组合字符,请查看派生组合类,其中列出了所有组合字符(以及其他字符)。因为你只是对计数感兴趣,所以你可以将它们排除掉——让你有一个稍微更接近的估计。
在 Angus 链接的帖子中,BMP 之外的 JavaScript 字符串显示了处理代理项的代码。但该代码实际上与您想要的相反 - 它将 0x10000+ 代码点拆分为两个代码点。就 JS 而言,它只是一个代码点——尽管是一个被截断的代码点。谁在乎?你正在计算它们,而不是显示......
但是,您可能还想处理另一类代码点,即不可打印字符。当然是 0x20 以下的任何值,但还有很多其他值——例如 0x2000 范围。这些也不可见,不应包含在您的计数中。
归档时间: |
|
查看次数: |
1665 次 |
最近记录: |