【问题标题】:Get Emoji Count In String获取字符串中的表情符号计数
【发布时间】:2017-12-27 16:58:41
【问题描述】:

我想知道用户在EditText 中输入了多少表情符号。如果用户只输入表情符号,并且使用 3 个或更少,我希望能够在应用程序中以更大的字体显示该字符串。

现在我确实遇到了这篇文章,它确实有助于检测字符串中是否存在表情符号,但我无法弄清楚如何计算表情符号的数量。

Detecting if a character in a String is an emoticon (using Android)

有人知道如何从字符串中获取表情符号数吗?

【问题讨论】:

    标签: android android-edittext character emoji


    【解决方案1】:

    对我来说最好的方法是codePointCount method

    例如,如果文本值为“?”,则此方法返回 1:

        fun getLengthWithEmoji(name: String): Int {
            return name.codePointCount(0, name.length)
        }
    

    【讨论】:

    • "‍?" 这种情况下不会返回 1
    【解决方案2】:

    另一种方法是利用EmojiCompat。此代码假定您在应用程序启动时初始化了EmojiCompat。这里的基本思想是让EmojiCompat 处理你的CharSequence,在任何表情符号出现的地方插入EmojiSpan 的实例,然后检查结果,返回处理后的EmojiSpan 实例的计数Spannable

    public static int getEmojiCount(CharSequence charSequence) {
        int count = 0;
        CharSequence processed = EmojiCompat.get().process(charSequence, 0, charSequence.length() -1, Integer.MAX_VALUE, EmojiCompat.REPLACE_STRATEGY_ALL);
        if (processed instanceof Spannable) {
            Spannable spannable = (Spannable) processed;
            count = spannable.getSpans(0, spannable.length() - 1, EmojiSpan.class).length;
        }
        return count;
    }
    

    不要忘记在app gradle中添加依赖:

    implementation 'androidx.emoji:emoji:1.1.0'
    

    【讨论】:

      【解决方案3】:

      试试这个

      private TextWatcher textWatcher = new TextWatcher() {
          @Override
          public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
              editText.post(new Runnable() {
                  @Override
                  public void run() {
                      if (length < 100) {
                          if (count > 0 && after <= 0)/*remove emoij*/ {
                              Log.i("MainActivity", "emoij -> down length");
                              length--;
                          } else if (count > after)/*remove text*/ {
                              Log.i("MainActivity", "text -> down length");
                              length--;
                          } else if (count == 0 && after > 1)/*emoij*/ {
                              Log.i("MainActivity", "emoij -> increase");
                              ++length;
                          } else if (count == 0 && after == 1)/*Text*/ {
                              Log.i("MainActivity", "text -> increase");
                              ++length;
                          } else if (count > 0 && after > 1) {
                              Log.i("MainActivity", "text -> increase");
                              ++length;
                          }
                          if (s.length() <= 0)
                              length = 0;
                          Log.w("MainActivity", " Length: " + length);
                      } else {
                          if (count > 0 && after <= 0)/*remove emoij*/ {
                              Log.i("MainActivity", "emoij -> down length");
                              length--;
                          } else if (count > after)/*remove text*/ {
                              Log.i("MainActivity", "text -> down length");
                              length--;
                          }
                           Log.w("MainActivity", " Length: " + length);
                      }
      
                      if (length == 100) {
                          editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(s.length())});
                      } else {
                          editText.setFilters(new InputFilter[]{});
                      }
                  }
              });
          }
      
          @Override
          public void onTextChanged(CharSequence s, int start, int before, int count) {
      
          }
      
          @Override
          public void afterTextChanged(Editable s) {
      
          }
      };
      

      `

      【讨论】:

        【解决方案4】:

        我的方法是导入这个库:

        implementation 'com.vdurmont:emoji-java:4.0.0'
        

        然后我创建了一个实用方法来获取将 emojis 计数为 1 的字符串长度:

        fun getLengthWithEmoji(s: String): Int{
                var emojiCount = EmojiParser.extractEmojis(s).size;
                var noEmojiString = EmojiParser.removeAllEmojis(s);
                var emojiAndStringCount = emojiCount + noEmojiString.length;
                return emojiAndStringCount;
        }
        

        通常要“获取字符串中的表情符号计数”,我会使用这一行:

        var emojiCount = EmojiParser.extractEmojis(s).size;
        

        这说明了所有最新的表情符号(取决于您的库的最新程度)。检查其他人在库中创建的一些分叉,因为他们在某些情况下添加了缺失的表情符号模式。

        【讨论】:

          【解决方案5】:
              int emojiCount = 0;
          
              for (int i = 0; i < yourString.length(); i++) {
               int type = Character.getType(yourString.charAt(i));
                if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) {
                 emojiCount++;
                }
              }
          
          return emojiCount/2;
          

          【讨论】:

          • 它会将其他奇怪的 Unicode 字符视为表情符号吗?
          • 是的。对于严格的表情符号,使用: if(Character.UnicodeBlock.of(char) == Character.UnicodeBlock.EMOTICONS){ //emoji entered } Requires API >= 19
          • @RohanTaneja 所以,如果 API Level 是 19 及以上,我可以简单地使用 Character.UnicodeBlock.of(char) == Character.UnicodeBlock.EMOTICONS?
          猜你喜欢
          • 1970-01-01
          • 2021-03-12
          • 1970-01-01
          • 2017-12-31
          • 2014-09-02
          • 1970-01-01
          • 2019-04-18
          • 2015-03-24
          • 1970-01-01
          相关资源
          最近更新 更多