Ответ 1
Вы также можете попытаться найти emoji, используя регулярное выражение: "[\ ue415\ue056\ue057]" вместо сравнения байтов. 😺
У меня есть проблема с отображением значка emoji в Android TextView
Сначала я нашел список иконки emoji в юникоде: http://www.easyapns.com/category/just-for-fun
Во-вторых, я нашел, как отображать значок emoji здесь: https://github.com/sharakova/EmojiTextView/blob/master/src/jp/sharakova/android/emoji/EmojiTextView.java
EmojiTextView.java автоматически преобразует предопределенный символ в значок emoji. Поэтому я хочу заменить все вхождения символа emoji в String на некоторый предопределенный символ и поместить результат в EmojiTextView.java Проблема в том, что мой код не может распознать значок emoji в строке, содержащей значок emoji.
Вот мой фрагмент кода - я пытаюсь найти, если вход соответствует любому юникоду значка emoji:
// Array list of all emoji icon
private static final String[] ArrayEUnicodeString ={
"\uE415",
"\uE056",
"\uE057",
...
}
// Nothing matched when it receive emoji icon with unicode "\uE415" from iphone. 'input' is message received from XMPP server
for (int i=0; i < emojiLength; i++)
{
if (input.getBytes() == ArrayEUnicodeString[i].getBytes())
Log.e("test", "ArrayEUnicodeString found");
}
// Note: iphone can display the emoji icon if I send "\uE415"
Я плохо разбираюсь в сравнении/конвенции по Юникоду. Может кто-нибудь помочь мне, пожалуйста, спасибо!
Вы также можете попытаться найти emoji, используя регулярное выражение: "[\ ue415\ue056\ue057]" вместо сравнения байтов. 😺
Почему вы хотите встроить защищенные изображения Apple emoji в ваше приложение?
Стандарт Unicode включает 722 emoji, которые могут отображаться шрифтом Android по умолчанию, просто введя символы Unicode в поле EditText
или TextView
.
Кроме того, вы можете использовать следующую библиотеку (в папке "Java" ) для автоматического преобразования популярных смайликов типа :-)
в соответствующий Unicode emoji:
Он отлично работает, если вы преобразовываете строку в массив char и проверяете каждый char, например:
StringBuilder sb = new StringBuilder();
for (char curr : str.toCharArray()) {
sb.append((SUPPORTED_EMOJI_SET.contains(curr)) ? convertCharToImgTag(curr) : curr);
}
где SUPPORTED_EMOJI_SET - это всего лишь набор символов, например:
new HashSet<Character>() {{
add('\ue415');
add('\ue056');
...
}}
Вы также можете сделать это с помощью регулярного выражения, но я верю, что приведенное выше будет работать быстрее.
Здесь, пожалуйста, перейдите ниже:
Проблема: Внутри TextView вместо Emoji отображается строка \ue415\ue056\ue057.
Коренная причина: В java или android программно строковое представление Emoji вы получите как \\ue415\\ue056\\ue057. Но когда вы пытаетесь напечатать одну и ту же строку в консоли или LogCat, тогда escape-символ будет удален, и вы получите строку как \ue415\ue056\ue057, из-за которой основная причина этой проблемы не обнаруживается.
Решение: Чтобы решить эту проблему, нам необходимо обработать escape-символ. Я создал ниже метод, который решает эту проблему.
public static String getEmojiFromString(String emojiString) {
if (!emojiString.contains("\\u")) {
return emojiString;
}
String emojiEncodedString = "";
int position = emojiString.indexOf("\\u");
while (position != -1) {
if (position != 0) {
emojiEncodedString += emojiString.substring(0, position);
}
String token = emojiString.substring(position + 2, position + 6);
emojiString = emojiString.substring(position + 6);
emojiEncodedString += (char) Integer.parseInt(token, 16);
position = emojiString.indexOf("\\u");
}
emojiEncodedString += emojiString;
return emojiEncodedString;
}