正如标题所说。我想查明给定的 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/