不分割表情符号的JavaScript子字符串

时间:2018-09-26 22:13:55

标签: javascript utf-8 substring emoji

在我的js中,我尝试substring()文本通常可以正常工作,但不幸的是断头了表情符号。

usaText = "AZ"
splitText = usaText.substring(0,2) //"A�"
splitText = usaText.substring(0,3) //"A"
splitText = usaText.substring(0,4) //"A�"
splitText = usaText.substring(0,5) //"A"

有没有一种方法可以使用子字符串而不破坏表情符号?在我的生产代码中,我削减了约40个字符,我不介意是35还是45。我曾想过只检查第40个字符是数字还是在a到z之间,但是如果收到文本,那将不起作用充满表情符号。我可以检查最后一个字符是否是通过模式匹配“结束”表情符号的字符,但这在性能上似乎也有些怪异。

我想念什么吗? JavaScript带来的所有膨胀,没有内置的count将表情符号视为一体?

对于Split JavaScript string into array of codepoints? (taking into account "surrogate pairs" but not "grapheme clusters")事情:

chrs = Array.from( usaText )
(4) ["A", "", "", "Z"]
0: "A"
1: ""
2: ""
3: "Z"
length: 4

不幸的是,那太多了。

3 个答案:

答案 0 :(得分:3)

所以这并不是一件容易的事,我倾向于告诉你,你不应该自己写这个。您应该使用runes之类的库。

只需一个简单的npm i runes,然后:

const runes = require('runes');
const usaText = "AZ";
runes.substr(usaText, 0, 2); // "A"

答案 1 :(得分:2)

免责声明:这只是扩展Mike'Pomax'Kamermans的上述评论,因为对我来说,这实际上是一个更简单,适用的答案(对于那些不喜欢阅读所有评论的人):

Array.from(str)将字符串拆分为单个unicode字符,而不会在字节之间打断它们。

有关详细信息,请参见Split JavaScript string into array of codepoints? (taking into account "surrogate pairs" but not "grapheme clusters")

答案 2 :(得分:1)

此代码对我有用:

splitText = Array.from(usaText).slice(0, 5).join('');