一个emoji文本用javascript该如何正确计算其文本长度?
最容易想到的天然是用length
来求长度。如下列举常见emoji和复杂emoji。javascript
// size: 2 "?".length // size: 7 "???".length
因为JavaScript的字符编码问题,天然行不通。详情请参见文章末尾的博文。
基于常见的emoji可使用如下正则匹配。html
// 匹配UTF-16的代理对,把代理对改成一个BMP的字符 function countSymbols(string) { var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; return string.replace(regexAstralSymbols, '_').length; } countSymbols("?"); // size: 1 countSymbols("???"); // size: 4
可是仍然出现了问题。那么一些更复杂的emoji表情的时候,仍是挂掉了。???
这个表情实际上是苹果中表情农民,在Full Emoji List, v5.0里第218个表情。此表情由U+1F468 U+1F3FC U+200D U+1F33E
组成。因此直接求长度为 2 + 2 + 1 + 2 = 7。这也在所不免了。java
那么该作如何解?git
这时候社区里有twitter的关于emoji的一个工具库twemoji,利用这个工具库,能够方便的实现emoji文本的实现。github
twemoji.parse("???") // "<img class="emoji" draggable="false" alt="???" src="https://twemoji.maxcdn.com/2/72x72/1f468-1f3fc-200d-1f33e.png"/>"
所以可见。twemoji正确的识别了并达到了咱们的预期。用户任意输入一个emoji,咱们都只计算为一个长度。利用twemoji解析emoji并返回图片的特性,结合正则能够实现一个函数。web
function countSymbols(string) { return twemoji.parse(string).replace(/<img.+?\/>/g, '_').length; } countSymbols("?"); // size: 1 countSymbols("???"); // size: 1
好的问题解决了。结合twemoji和简单的正则就能够实现一个文本计算函数函数
countSymbols("??? and ? parse correctly!"); // size: 24
其实当字符计算解决后,输入框限制字符数就垂手可得了。思路就是每次input事件发生时,先判断当前字符数是否超过限制,若是超出,则用上一次的文本替换当前输入框的文本。大体代码以下。工具
var prevText = ''; var textarea = document.getElementById('input-area'); var limit = 250; function limitTextSize(){ var text = textarea.value; var size = countSymbols(text); if(size > limit) { textarea.value = prevText; } else { prevText = text; } }
但愿能给你们带来点帮助。求点赞哈哈~编码
Unicode与JavaScript详解
Emoji.prototype.length —— Unicode 字符那些事儿
JavaScript 有个 Unicode 的天坑prototype