我有个小问题。
我使用NodeJS作为后端。现在,用户有一个字段“传记”,用户可以写一些关于他自己的东西。
假设这个字段的最大长度为220,并将其作为输入:
♀️♀️♀️♀️♀️♀️⚕️⚕️ 如您所见,没有220个表情符号(37个表情符号),但如果我在我的nodejs服务器中这样做的话
console.log(bio.length)生物是输入文字的地方,我得到221。如何“解析”字符串输入以获得正确的长度?这是unicode的问题吗?
解决了
我使用了这个库:https://github.com/orling/grapheme-splitter
我试过了:
var Grapheme = require('grapheme-splitter');
var splitter = new Grapheme();
console.log(splitter.splitGraphemes(bio).length);长度是37。它工作得很好!
发布于 2019-01-25 16:51:42
str.length给出UTF-16单位的计数.[...str].length,因为可迭代协议将字符串拆分为编码点。另请参阅:
发布于 2019-01-25 17:59:46
TL;DR有解决方案,但它们并不是在每种情况下都有效。Unicode可以感觉像一种黑暗的艺术。
我看到的各种解决方案似乎都有局限性,问题超出了表情符号的范围,涵盖了Unicode范围内的其他字符。如果使用精梳字符,则可以将“考虑”存储为“或e+”。这甚至可能导致两个字符串看起来相同的不平等。还要注意,在某些情况下,单个表情符号在存储时可以是11个字符,假设为UTF16,结果是22个字节。
处理这种情况的方式以及字符组合或显示的方式,在浏览器和操作系统之间甚至可能有所不同。因此,虽然你可能认为你破解了它,但另一种环境有可能破坏它。一定要在重要的地方进行测试。
现在,有一个前端和后端的问题:您解决了字符计数问题,因此它对人类用户很好地工作,现在您的单个表情符号吹过了数据库中分配的字段大小。对于诸如mongo这样的数据库,问题较少,但在SQL数据库中,字段分配是保守的。这意味着如何解决问题将取决于最困难的限制来自哪里。
请注意,基本解决方案确实涉及将字符串转换为数组并获取长度,并接受限制:
Array.from(str)当字符被组合并处理星体面时,这将分崩离析。
考虑到限制因素的一些高级别办法:
此外,考虑到问题的复杂性,如果有一个流行的JS库已经处理了这个问题,那么它可能值得一看吗?在撰写本报告时,我没有找到一个。希望这在某一时刻成为Javascript的核心。
供阅读的其他页:
发布于 2020-10-09 10:21:55
https://stackoverflow.com/questions/54369513
复制相似问题