首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在javascript中使用emojis计算字符串的正确长度?

如何在javascript中使用emojis计算字符串的正确长度?
EN

Stack Overflow用户
提问于 2019-01-25 16:45:43
回答 8查看 17.6K关注 0票数 41

我有个小问题。

我使用NodeJS作为后端。现在,用户有一个字段“传记”,用户可以写一些关于他自己的东西。

假设这个字段的最大长度为220,并将其作为输入:

代码语言:javascript
复制
‍♀️‍♀️‍♀️‍♀️‍♀️‍♀️‍⚕️‍⚕️‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 

如您所见,没有220个表情符号(37个表情符号),但如果我在我的nodejs服务器中这样做的话

代码语言:javascript
复制
console.log(bio.length)

生物是输入文字的地方,我得到221。如何“解析”字符串输入以获得正确的长度?这是unicode的问题吗?

解决了

我使用了这个库:https://github.com/orling/grapheme-splitter

我试过了:

代码语言:javascript
复制
var Grapheme = require('grapheme-splitter');
var splitter = new Grapheme();
console.log(splitter.splitGraphemes(bio).length);

长度是37。它工作得很好!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2019-01-25 16:51:42

  1. str.length给出UTF-16单位的计数.
  2. 在码点(以字符为单位)中获得字符串长度的方法是[...str].length,因为可迭代协议将字符串拆分为编码点。
  3. 如果我们需要图形素(字形素簇)中的长度,我们有以下几种本地方式: a. Unicode属性在RegExp中转义。例如,参见:Unicode感知版本\w匹配表情符号Intl.Segmenter --很快就要来了,可能在ES2021.可以在上一个V8版本中使用标志进行测试(实现与V8 86中的最后一个规范同步)。在V8 87中不加标记(发运)。

另请参阅:

票数 46
EN

Stack Overflow用户

发布于 2019-01-25 17:59:46

TL;DR有解决方案,但它们并不是在每种情况下都有效。Unicode可以感觉像一种黑暗的艺术。

我看到的各种解决方案似乎都有局限性,问题超出了表情符号的范围,涵盖了Unicode范围内的其他字符。如果使用精梳字符,则可以将“考虑”存储为“或e+”。这甚至可能导致两个字符串看起来相同的不平等。还要注意,在某些情况下,单个表情符号在存储时可以是11个字符,假设为UTF16,结果是22个字节。

处理这种情况的方式以及字符组合或显示的方式,在浏览器和操作系统之间甚至可能有所不同。因此,虽然你可能认为你破解了它,但另一种环境有可能破坏它。一定要在重要的地方进行测试。

现在,有一个前端和后端的问题:您解决了字符计数问题,因此它对人类用户很好地工作,现在您的单个表情符号吹过了数据库中分配的字段大小。对于诸如mongo这样的数据库,问题较少,但在SQL数据库中,字段分配是保守的。这意味着如何解决问题将取决于最困难的限制来自哪里。

请注意,基本解决方案确实涉及将字符串转换为数组并获取长度,并接受限制:

代码语言:javascript
复制
Array.from(str)

当字符被组合并处理星体面时,这将分崩离析。

考虑到限制因素的一些高级别办法:

  • 尽可能使用解决前端问题的方法,然后确保存储问题得到解决。
  • 如果数据库或其他存储无法调整,则对广告中的前端限制要更加保守。
  • 限制可输入的字符类型
  • 明确指出长度计算的限制

此外,考虑到问题的复杂性,如果有一个流行的JS库已经处理了这个问题,那么它可能值得一看吗?在撰写本报告时,我没有找到一个。希望这在某一时刻成为Javascript的核心。

供阅读的其他页:

票数 5
EN

Stack Overflow用户

发布于 2020-10-09 10:21:55

我回答了一个类似的问题,这里

但基本上,这里是:

代码语言:javascript
复制
''.match(/./gu).length == 1

作为:

代码语言:javascript
复制
''.length == 2

在我最初的文章中更精确

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54369513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档