【问题标题】:JavaScript substring without splitting emoji不拆分表情符号的 JavaScript 子字符串
【发布时间】:2019-03-02 18:17:55
【问题描述】:

在我的 js 中,我正在尝试 substring() 文本,该文本通常有效,但不幸的是会斩首表情符号。

usaText = "A????????Z"
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 个字符是数字还是 az 之间,但如果你有文本,那就行不通了充满表情符号。我可以通过模式匹配检查最后一个字符是否是“结束”表情符号的字符,但这在性能方面似乎也有点奇怪。

我错过了什么吗?考虑到 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

不幸的是,这太多了。

【问题讨论】:

  • 您可以考虑寻找表情符号,记录它们的位置,然后删除它们。然后做子字符串,然后根据它们在原始字符串中的位置将表情符号放入子字符串中。子字符串的长度将不再相同,但您说这不是问题。
  • 忘掉“emoji”吧,你问的是代理对 UTF-16,它适用于普通语言,就像它们适用于 emoji 一样。对此有一个优雅的解决方案,已在 stackoverflow.com/questions/21397316/… 上回答,包括使用 Array.from(yourstring),它将您的字符串拆分为单独的 unicode 字符,而不会在字节之间破坏它们。
  • 请检查我的代码。我确实已经尝试过了,虽然它让我的情况有所好转,但它仍然给我留下了 2 个部分。

标签: javascript utf-8 substring emoji


【解决方案1】:

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

只是一个简单的npm i runes,那么:

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

【讨论】:

【解决方案2】:

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

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

详情请见Split JavaScript string into array of codepoints? (taking into account "surrogate pairs" but not "grapheme clusters")

【讨论】:

    【解决方案3】:

    这段代码对我有用:

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

    【讨论】:

    • 欢迎来到stackoverflow。除了您提供的答案之外,请考虑提供一个简短说明,说明为什么以及如何解决此问题。
    • 嘿,(0, 2) 在您的代码中得到A?。通常人们要么希望表情符号完全包含,要么根本不包含 - 而不是得到破碎的分数
    • 这是正确答案。不知道为什么它不是绿色的
    猜你喜欢
    • 2020-04-06
    • 2016-01-12
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2022-12-06
    • 2017-10-19
    相关资源
    最近更新 更多