【问题标题】:Counting unicode characters in Javascript [duplicate]在Javascript中计算unicode字符[重复]
【发布时间】:2014-10-07 04:59:28
【问题描述】:

我遇到了计数 unicode 字符的问题。我需要计算组合的 unicode 字符总数。

以这个字符为例:

द्ध

如果你在这个字符串上使用 .length 属性,它会给你 3。这在技术上是正确的,因为它是一个组合

但是,将द्ध放在文本区域中,然后使用箭头键您会意识到它被视为一个字符。只有当你使用退格时,你才会意识到有 3 个字符。

编辑:对于您的测试用例,请考虑它可能是一个词。可能是这样的,

द्धद्द

.length 应该给出 2,但给出 6

当您想要获取或设置输入元素中的当前插入符号位置时,这是一个问题。

【问题讨论】:

  • 那么,您想要逻辑字符数而不是 UTF-16 代码单元?
  • 有趣的问题。更重要的是,在 Python 中,len("द्ध") 是 9,len("द") 是 3。
  • @Deduplicator 是的,类似的东西。我正在做一些事情,需要在 textarea 上获得插入符号的位置。但由于没有正确读取长度,我很难准确地获得位置。
  • 在chrome中,如果我尝试将carret放在这个字符之后,我实际上需要用长度3来计算它:jsfiddle.net/c68rwwut。所以我想这个问题实际上不是问题。
  • 问题应该重新打开,或者至少链接到其他地方。这是关于计算字素,而“重复”是关于字节长度,完全不相关。

标签: javascript unicode


【解决方案1】:

您的示例“द्ध”是一个由三个 Unicode 字符组成的字符串,length 属性正确地表明了这一点。

您显然想要计算的是某种其他意义上的“字符”,例如“一种语言的使用者直观地将其视为一个字符”。这是一个模糊和可变的概念。 Unicode 标准附件 UAX #29 Unicode Text Segmentation 试图分析这个概念,称之为“字素簇”,并描述了一些使用它的算法。

不幸的是,JavaScript 没有内置工具来识别字符是否为例如组合标记,这应该被视为集群的一部分。但是,如果您可以限制自己只处理一种书写系统,您可能可以手动编写操作代码,通过代码编号引用可能的 Unicode 字符。

此外,如果目的是使计数与某些输入编辑器的工作方式相匹配(例如,箭头键如何覆盖字符),您需要了解该编辑器的逻辑。它可能在某种意义上实现了 Unicode 字素集群,或者其他。

【讨论】:

  • 对于在遥远的未来发现这一点的任何人:有坏消息、好消息和更多坏消息。不好:仍然没有内置的方法来计算字素。好:there's a package 实现了链接的 UAX。不好:超过 200k,即使您只想计算单个字符串中的字形数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2019-06-20
相关资源
最近更新 更多