Sta*_*edo 5 javascript node.js emoji
我有点问题
我正在使用NodeJS作为后端。现在,用户拥有一个“传记”字段,用户可以在其中写一些关于他自己的东西。
假设此字段的最大长度为220,并将其作为输入:
????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
如您所见,没有220个表情符号(有37个表情符号),但是如果我在nodejs服务器中这样做
console.log(bio.length)
Run Code Online (Sandbox Code Playgroud)
输入文本在何处,我得到221。如何“解析”字符串输入以获得正确的长度?关于Unicode是否有问题?
解决了
我使用了这个库:https : //github.com/orling/grapheme-splitter
我尝试过:
var Grapheme = require('grapheme-splitter');
var splitter = new Grapheme();
console.log(splitter.splitGraphemes(bio).length);
Run Code Online (Sandbox Code Playgroud)
长度为37。效果很好!
str.length给出UTF-16单位的数量。Unicode验证的以代码点(以字符为单位)获取字符串长度的方法是[...str].length可迭代协议将字符串拆分为代码点。
也可以看看:
每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集(无借口!)
每个JavaScript开发人员应该了解的Unicode知识
TL;DR 有一些解决方案,但它们并不适用于所有情况。Unicode 感觉像是一门黑暗艺术。
\n\n我见过的各种解决方案似乎都存在局限性,问题超出了表情符号范围,还涵盖了 Unicode 范围内的其他字符。如果使用组合字符,则考虑 \xc3\xa9 可以存储为 \xc3\xa9 或 e + \xe2\x80\x98 。这甚至可能导致两个看起来相同的字符串不相等。另请注意,在某些情况下,单个表情符号在存储时可以是 11 个字符,因此假设为 UTF16,则为 22 个字节。
\n\n处理方式以及字符组合或显示方式甚至可能因浏览器和操作系统而异。因此,虽然您可能认为自己已经破解了它,但另一个环境可能会破坏它。一定要测试重要的地方。
\n\n现在,存在前端与后端问题:您解决了字符计数问题,因此它对于人类用户来说效果很好,现在您的单个表情符号直接超过了数据库中分配的字段大小。对于 mongo 等数据库来说问题不大,但对于 SQL 数据库可能会出现问题,因为 SQL 数据库的字段分配比较保守。这意味着您如何解决问题将取决于最困难的限制出现在哪里。
\n\n请注意,基本解决方案确实涉及将字符串转换为数组并获取长度,接受限制:
\n\nArray.from(str)\nRun Code Online (Sandbox Code Playgroud)\n\n当角色组合起来并处理星体位面时,这将分崩离析。
\n\n一些考虑到限制的高级方法:
\n\n此外,考虑到问题的复杂性,是否有一个流行的 JS 库已经可以处理这个问题可能值得看看?在撰写本文时我没有找到。希望这会在某个时候成为 Javascript 的核心。
\n\n其他需要阅读的页面:
\n\n我在这里回答了类似的问题
但基本上,它是:
''.match(/./gu).length == 1
Run Code Online (Sandbox Code Playgroud)
作为 :
''.length == 2
Run Code Online (Sandbox Code Playgroud)
我原来的帖子更精确
| 归档时间: |
|
| 查看次数: |
1849 次 |
| 最近记录: |