emojis - emoticon java




Remova ✅, 🔥, ✈, ♛ e outros tais emojis/imagens/sinais de strings Java (5)

Eu tenho algumas cordas com todos os tipos de emojis / imagens / sinais diferentes.

Nem todas as strings estão em inglês - algumas delas estão em outros idiomas não latinos, por exemplo:

▓ railway??
→ Cats and dogs
I'm on 🔥
Apples ⚛ 
✅ Vi sign
♛ I'm the king ♛ 
Corée ♦ du Nord ☁  (French)
 gjør at både ◄╗ (Norwegian)
Star me ★
Star ⭐ once more
早上好 ♛ (Chinese)
Καλημέρα ✂ (Greek)
another ✓ sign ✓
добрай раніцы ✪ (Belarus)
◄ शुभ प्रभात ◄ (Hindi)
✪ ✰ ❈ ❧ Let's get together ★. We shall meet at 12/10/2018 10:00 AM at Tony's.❉

... e muitos mais destes.

Eu gostaria de me livrar de todos esses sinais / imagens e manter apenas as letras (e pontuação) nos diferentes idiomas.

Eu tentei limpar os sinais usando a biblioteca EmojiParser :

String withoutEmojis = EmojiParser.removeAllEmojis(input);

O problema é que o EmojiParser não consegue remover a maioria dos sinais. O sinal ♦ é o único que encontrei até agora que foi removido. Outros sinais como ✪ ❉ ★ ✰ ❈ ❧ ✂ ❋ ❋ ✿ ♛ 🔥 não são removidos.

Existe uma maneira de remover todos esses sinais das strings de entrada e manter apenas as letras e a pontuação nos diferentes idiomas ?


Com base na Lista Completa de Emojis, v11.0, você tem 1644 pontos de código Unicode diferentes para remover. Por exemplo, está nesta lista como U+2705 .

Tendo a lista completa de emojis, você precisa filtrá-los usando pontos de código . A iteração de um único char ou byte não funcionará, pois um único ponto de código pode abranger vários bytes. Como o Java usa emojis UTF-16, normalmente, serão necessários dois char .

String input = "ab✅cd";
for (int i = 0; i < input.length();) {
  int cp = input.codePointAt(i);
  // filter out if matches
  i += Character.charCount(cp); 
}

O mapeamento do ponto de código Unicode U+2705 para Java int é direto:

int viSign = 0x2705;

ou desde que o Java suporta Unicode Strings:

int viSign = "✅".codePointAt(0);

Em vez de colocar alguns elementos na lista negra, que tal criar uma lista de permissões dos personagens que você deseja manter? Dessa forma, você não precisa se preocupar com todos os novos emojis adicionados.

String characterFilter = "[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]";
String emotionless = aString.replaceAll(characterFilter,"");

Assim:

  • [\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s] é um intervalo representando todos os valores numéricos ( \\p{N} ), letra ( \\p{L} ), marca ( \\p{M} ), pontuação ( \\p{P} ), espaço em branco / separador ( \\p{Z} ), outra formatação ( \\p{Cf} ) e outros caracteres acima de U+FFFF em caracteres Unicode ( \\p{Cs} ) e nova linha ( \\s ). \\p{L} inclui especificamente os caracteres de outros alfabetos, como cirílico, latim, kanji etc.
  • O ^ no conjunto de caracteres regex nega a correspondência.

Exemplo:

String str = "hello world _# 皆さん、こんにちは! 私はジョンと申します。🔥";
System.out.print(str.replaceAll("[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]",""));
// Output:
//   "hello world _# 皆さん、こんにちは! 私はジョンと申します。"

Se você precisar de mais informações, confira a documentation Java para regexes.


Eu não sou super em Java, então eu não vou tentar escrever código de exemplo em linha, mas a maneira que eu faria isso é verificar o que o Unicode chama de "a categoria geral" de cada caractere. Existem algumas categorias de letras e pontuação.

Você pode usar Character.getType para encontrar a categoria geral de um determinado caractere. Você provavelmente deve reter os caracteres que se enquadram nessas categorias gerais:

COMBINING_SPACING_MARK
CONNECTOR_PUNCTUATION
CURRENCY_SYMBOL
DASH_PUNCTUATION
DECIMAL_DIGIT_NUMBER
ENCLOSING_MARK
END_PUNCTUATION
FINAL_QUOTE_PUNCTUATION
FORMAT
INITIAL_QUOTE_PUNCTUATION
LETTER_NUMBER
LINE_SEPARATOR
LOWERCASE_LETTER
MATH_SYMBOL
MODIFIER_LETTER
MODIFIER_SYMBOL
NON_SPACING_MARK
OTHER_LETTER
OTHER_NUMBER
OTHER_PUNCTUATION
PARAGRAPH_SEPARATOR
SPACE_SEPARATOR
START_PUNCTUATION
TITLECASE_LETTER
UPPERCASE_LETTER

(Todos os caracteres que você listou como especificamente desejando remover têm a categoria geral OTHER_SYMBOL , que eu não incluí na lista de permissões da categoria acima.)


Experimente este projeto simple-emoji-4j

Compatível com Emoji 12.0 (2018.10.15)

Simples com:

EmojiUtils.removeEmoji(str)

Use um plugin do jQuery chamado RM-Emoji. Veja como isso funciona:

$('#text').remove('emoji').fast()

Este é o modo rápido que pode perder alguns emojis, pois usa algoritmos heurísticos para encontrar emojis no texto. Use o método .full() para escanear toda a string e remover todos os emojis garantidos.





emoji