java - 检测字符串中的字符是否为表情符号(使用 Android)

标签 java android emoticons

正如标题所说。我想查明给定的 java String 是否包含表情符号。

我不能使用 Character.UnicodeBlock.of(char) == Character.UnicodeBlock.EMOTICONS 因为它需要 API 级别 19。

I found this code for iOS但它并不真正适用,因为它看起来像 java 和 objective-c 以不同的方式处理代理对。

我查看的文档告诉我:

A char value, therefore, represents Basic Multilingual Plane (BMP) code points, including the surrogate code points, or code units of the UTF-16 encoding

我不太清楚那是什么意思。这是否仅仅意味着他们也将 BMP 点作为他们的第一个数字?

According to Wikipedia表情符号集位于 0x1f600 和 0x1f64f 之间,但我不知道如何检查字符是否在该范围内。

我曾希望这样的事情会奏效,但没有成功

if (0x1f600 <= a && a <= 0x1f64f)
{
    Print.d("Unicode", "groovy!");
}

那我该怎么做呢?

最佳答案

四年后...

此时,利用 EmojiCompat 可能更有意义。此代码假定您在应用启动时初始化了 EmojiCompat。这里的基本思想是让 EmojiCompat 处理您的 CharSequence,在任何表情符号出现的地方插入 EmojiSpan 的实例,然后检查结果。

public static boolean containsEmoji(CharSequence charSequence) {
    boolean result = false;
    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;
        result = spannable.getSpans(0, spannable.length() - 1, EmojiSpan.class).length > 0;
    }
    return  result;
}

如果您想收集出现在给定 CharSequence 中的独特表情符号列表,您可以这样做,迭代 getSpans() 的结果并找到每个跨度的开始和结束以捕获 EmojiCompat 发现的表情符号:

@NonNull
public static List<String> getUniqueEmoji(CharSequence charSequence) {
    Set<String> emojiList = new HashSet<>();
    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;

        EmojiSpan[] emojiSpans = spannable.getSpans(0, spannable.length() - 1, EmojiSpan.class);
        for (EmojiSpan emojiSpan : emojiSpans) {
            int spanStart = spannable.getSpanStart(emojiSpan);
            int spanEnd = spannable.getSpanEnd(emojiSpan);
            CharSequence emojiCharSequence = spannable.subSequence(spanStart, spanEnd);
            emojiList.add(String.valueOf(emojiCharSequence));
        }
    }
    return emojiList.size() > 0 ? new ArrayList<>(emojiList) : new ArrayList<String>();
}

更新:这是 EmojiCompat 初始化的示例。可以从您的应用程序 onCreate() 方法调用此静态方法,将应用程序本身作为上下文参数传递。

@JvmStatic
fun initEmojiCompat(context: Context) {
    if (emojiCompatConfig != null) {
        // alternatively, EmojiCompat.reset() could be called here
        logger().w(LOGTAG, "EmojiCompat already initialized.")
        return
    }

    // "Noto Color Emoji Compat" doesn't have graphics for the following emojis:
    // U+1F5E3 "speaking head" (required)
    // U+1F441 "eye" (required)
    // U+1F575 "detective" (nice to have)
    val fontRequest = FontRequest(
        "com.google.android.gms.fonts",
        "com.google.android.gms",
        "Noto Color Emoji Compat",
        R.array.com_google_android_gms_fonts_certs
    )

    emojiCompatConfig = FontRequestEmojiCompatConfig(context, fontRequest)
        .setReplaceAll(false)
        .setEmojiSpanIndicatorEnabled(false)
        .registerInitCallback(initCallback)
        .also {
            EmojiCompat.init(it)
        }
}

关于java - 检测字符串中的字符是否为表情符号(使用 Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21392969/

相关文章:

java - ActionListener 似乎不起作用?

java - 如何使用 python 从 android/java 验证 ECC 签名

java - 无法在 glassfish 上部署 war 项目

黑莓:聊天应用程序中的表情符号

java - 当我的所有线程在 android 中完成时,我如何执行函数?

android - quickblox 示例视频聊天在屏幕关闭时不接听电话

android - 声音池 : sample 1 not READY

android - lastUpdateTime 的准确值是多少?

java - Android EditText 动态改变文字为表情符号

Android- 聊天应用程序 - 转换字符串中的编辑框表情符号 ;) 格式以保存在数据库中