Supprimez ✅, 🔥, ✈, ♛ et autres emojis / images / signes de la chaîne Java

J’ai des cordes avec toutes sortes de emojis / images / signes différents.

Toutes les chaînes ne sont pas en anglais – certaines d’entre elles sont dans d’autres langues que le latin, par exemple:

▓ 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.❉ 

… et beaucoup d’autres.

Je voudrais me débarrasser de tous ces signes / images et ne conserver que les lettres (et les signes de ponctuation) dans les différentes langues.

J’ai essayé de nettoyer les signes en utilisant la bibliothèque EmojiParser :

 Ssortingng withoutEmojis = EmojiParser.removeAllEmojis(input); 

Le problème est que EmojiParser n’est pas en mesure de supprimer la majorité des signes. Le signe ♦ est le seul que j’ai trouvé jusqu’à présent qu’il a été supprimé. D’autres signes tels que ❉ ❉ ★ ✰ ❈ ❧ ✂ ❋ ⓡ ✿ ♛ removed ne sont pas supprimés.

Est-il possible de supprimer tous ces signes des chaînes d’entrée et de ne conserver que les lettres et la ponctuation dans les différentes langues ?

Au lieu de mettre en liste noire certains éléments, pourquoi ne pas créer une liste blanche des personnages que vous souhaitez conserver? De cette façon, vous n’avez pas à vous soucier de chaque nouvel emoji ajouté.

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

Alors:

  • [\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s] est une plage représentant tout numérique ( \\p{N} ), lettre ( \\p{L} ), marque ( \\p{M} ), ponctuation ( \\p{P} ), espace / séparateur ( \\p{Z} ), un autre formatage ( \\p{Cf} ) et d’autres caractères au-dessus de U+FFFF dans les caractères Unicode ( \\p{Cs} ) et newline ( \\s ). \\p{L} inclut spécifiquement les caractères d’autres alphabets tels que le cyrillique, le latin, le kanji, etc.
  • Le jeu de caractères ^ dans le regex annule la correspondance.

Exemple:

 Ssortingng 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 _# 皆さん、こんにちは! 私はジョンと申します。" 

Si vous avez besoin de plus d’informations, consultez la documentation Java pour les expressions régulières.

Je ne suis pas super en Java, alors je n’essaierai pas d’écrire un exemple de code en ligne, mais je voudrais vérifier ce que Unicode appelle “la catégorie générale” de chaque caractère. Il existe deux catégories de lettres et de ponctuation.

Vous pouvez utiliser Character.getType pour trouver la catégorie générale d’un caractère donné. Vous devriez probablement conserver les caractères appartenant à ces catégories générales:

 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 

(Tous les caractères que vous avez listés comme souhaitant être supprimés ont la catégorie générale OTHER_SYMBOL , que je n’ai pas OTHER_SYMBOL dans la liste blanche de la catégorie ci-dessus.)

Basé sur Full Emoji List, v11.0, vous avez 1644 points de code Unicode différents à supprimer. Par exemple, est sur cette liste comme U+2705 .

Ayant la liste complète des emojis, vous devez les filtrer en utilisant des points de code . Itérer sur un seul caractère ou byte seul byte ne fonctionnera pas car un seul sharepoint code peut couvrir plusieurs octets. Parce que Java utilise UTF-16, les émoticons prendront généralement deux caractères.

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

Le mappage entre le sharepoint code Unicode U+2705 et Java int est simple:

 int viSign = 0x2705; 

ou depuis que Java supporte les chaînes Unicode:

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

ICU4J est votre ami.

 UCharacter.hasBinaryProperty(UProperty.EMOJI); 

N’oubliez pas de garder votre version de icu4j à jour et notez que cela ne filtrera que les emoji Unicode officiels, pas les caractères de symboles. Combinez avec le filtrage des autres types de caractères comme vous le souhaitez.

Plus d’informations: http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI

J’ai donné quelques exemples ci-dessous et j’ai pensé que le latin suffisait, mais …

Existe-t-il un moyen de supprimer tous ces signes de la chaîne d’entrée et de ne conserver que les lettres et la ponctuation dans les différentes langues?

Après avoir modifié, développé une nouvelle solution, en utilisant la méthode Character.getType , et cela semble être le meilleur coup à cela.

 package zmarcos.emoji; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class TestEmoji { public static void main(Ssortingng[] args) { Ssortingng[] arr = {"Remove ✅, 🔥, ✈ , ♛ and other such signs from Java ssortingng", "→ Cats and dogs", "I'm on 🔥", "Apples ⚛ ", "✅ Vi sign", "♛ I'm the king ♛ ", "Star me ★", "Star ⭐ once more", "早上好 ♛", "Καλημέρα ✂"}; System.out.println("---only letters and spaces alike---\n"); for (Ssortingng input : arr) { int[] filtered = input.codePoints().filter((cp) -> Character.isLetter(cp) || Character.isWhitespace(cp)).toArray(); Ssortingng result = new Ssortingng(filtered, 0, filtered.length); System.out.println(input); System.out.println(result); } System.out.println("\n---unicode blocks white---\n"); Set whiteList = new HashSet<>(); whiteList.add(Character.UnicodeBlock.BASIC_LATIN); for (String input : arr) { int[] filtered = input.codePoints().filter((cp) -> whiteList.contains(Character.UnicodeBlock.of(cp))).toArray(); Ssortingng result = new Ssortingng(filtered, 0, filtered.length); System.out.println(input); System.out.println(result); } System.out.println("\n---unicode blocks black---\n"); Set blackList = new HashSet<>(); blackList.add(Character.UnicodeBlock.EMOTICONS); blackList.add(Character.UnicodeBlock.MISCELLANEOUS_TECHNICAL); blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS); blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS_AND_ARROWS); blackList.add(Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS); blackList.add(Character.UnicodeBlock.ALCHEMICAL_SYMBOLS); blackList.add(Character.UnicodeBlock.TRANSPORT_AND_MAP_SYMBOLS); blackList.add(Character.UnicodeBlock.GEOMETRIC_SHAPES); blackList.add(Character.UnicodeBlock.DINGBATS); for (String input : arr) { int[] filtered = input.codePoints().filter((cp) -> !blackList.contains(Character.UnicodeBlock.of(cp))).toArray(); Ssortingng result = new Ssortingng(filtered, 0, filtered.length); System.out.println(input); System.out.println(result); } System.out.println("\n---category---\n"); int[] category = {Character.COMBINING_SPACING_MARK, Character.COMBINING_SPACING_MARK, Character.CONNECTOR_PUNCTUATION, /*Character.CONTROL,*/ Character.CURRENCY_SYMBOL, Character.DASH_PUNCTUATION, Character.DECIMAL_DIGIT_NUMBER, Character.ENCLOSING_MARK, Character.END_PUNCTUATION, Character.FINAL_QUOTE_PUNCTUATION, /*Character.FORMAT,*/ Character.INITIAL_QUOTE_PUNCTUATION, Character.LETTER_NUMBER, Character.LINE_SEPARATOR, Character.LOWERCASE_LETTER, /*Character.MATH_SYMBOL,*/ Character.MODIFIER_LETTER, /*Character.MODIFIER_SYMBOL,*/ Character.NON_SPACING_MARK, Character.OTHER_LETTER, Character.OTHER_NUMBER, Character.OTHER_PUNCTUATION, /*Character.OTHER_SYMBOL,*/ Character.PARAGRAPH_SEPARATOR, /*Character.PRIVATE_USE,*/ Character.SPACE_SEPARATOR, Character.START_PUNCTUATION, /*Character.SURROGATE,*/ Character.TITLECASE_LETTER, /*Character.UNASSIGNED,*/ Character.UPPERCASE_LETTER}; Arrays.sort(category); for (Ssortingng input : arr) { int[] filtered = input.codePoints().filter((cp) -> Arrays.binarySearch(category, Character.getType(cp)) >= 0).toArray(); Ssortingng result = new Ssortingng(filtered, 0, filtered.length); System.out.println(input); System.out.println(result); } } } 

Sortie:

 ---only letters and spaces alike--- Remove ✅, 🔥, ✈ , ♛ and other such signs from Java ssortingng Remove and other such signs from Java ssortingng → Cats and dogs Cats and dogs I'm on 🔥 Im on Apples ⚛ Apples ✅ Vi sign Vi sign ♛ I'm the king ♛ Im the king Star me ★ Star me Star ⭐ once more Star once more早上好 ♛早上好Καλημέρα ✂ Καλημέρα ---unicode blocks white--- Remove ✅, 🔥, ✈ , ♛ and other such signs from Java ssortingng Remove , , , and other such signs from Java ssortingng → Cats and dogs Cats and dogs I'm on 🔥 I'm on Apples ⚛ Apples ✅ Vi sign Vi sign ♛ I'm the king ♛ I'm the king Star me ★ Star me Star ⭐ once more Star once more早上好 ♛ Καλημέρα ✂ ---unicode blocks black--- Remove ✅, 🔥, ✈ , ♛ and other such signs from Java ssortingng Remove , , , and other such signs from Java ssortingng → Cats and dogs → Cats and dogs I'm on 🔥 I'm on Apples ⚛ Apples ✅ Vi sign Vi sign ♛ I'm the king ♛ I'm the king Star me ★ Star me Star ⭐ once more Star once more早上好 ♛早上好Καλημέρα ✂ Καλημέρα ---category--- Remove ✅, 🔥, ✈ , ♛ and other such signs from Java ssortingng Remove , , , and other such signs from Java ssortingng → Cats and dogs Cats and dogs I'm on 🔥 I'm on Apples ⚛ Apples ✅ Vi sign Vi sign ♛ I'm the king ♛ I'm the king Star me ★ Star me Star ⭐ once more Star once more早上好 ♛早上好Καλημέρα ✂ Καλημέρα 

Le code fonctionne en diffusant la chaîne dans des points de code. Ensuite, en utilisant lambdas pour filtrer les caractères dans un tableau int , nous convertissons le tableau en Ssortingng.

Les lettres et les espaces utilisent les méthodes Character pour filtrer, ce qui n’est pas bon avec la ponctuation. Échec de la tentative .

Unicode bloque le filtre blanc en utilisant les blocs unicode spécifiés par le programmeur. Échec de la tentative .

Le Unicode bloque le filtre noir en utilisant les blocs unicode spécifiés par le programmeur. Échec de la tentative .

Le filtre de catégorie utilisant la méthode statique Character.getType . Le programmeur peut définir dans le tableau de category quels types sont autorisés. TRAVAUX 😨😱😰😲😀.

Utilisez un plugin jQuery appelé RM-Emoji. Voici comment cela fonctionne:

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

C’est le mode rapide qui peut manquer certains emojis car il utilise des algorithmes heuristiques pour trouver des emojis dans le texte. Utilisez la méthode .full() pour parsingr toute la chaîne et supprimer tous les emojis garantis.

En utilisant la bibliothèque tierce emoji-java on peut réaliser de nombreuses opérations sur les emoji facilement

Vous pouvez facilement supprimer les emojis d’une chaîne en utilisant l’une des méthodes suivantes:

  1. EmojiParser # removeAllEmojis (Ssortingng): supprime tous les emojis de la chaîne.
  2. EmojiParser # removeAllEmojisExcept (Ssortingng, Collection): supprime tous les emojis de la chaîne, à l’exception de ceux de la collection.
  3. EmojiParser # removeEmojis (Ssortingng, Collection): supprime les emojis de la collection de la chaîne.

Par exemple

 Ssortingng str = "An 😀awesome 😃ssortingng with a few 😉emojis!"; Collection collection = new ArrayList(); collection.add(EmojiManager.getForAlias("wink")); // This is 😉 System.out.println(EmojiParser.removeAllEmojis(str)); System.out.println(EmojiParser.removeAllEmojisExcept(str, collection)); System.out.println(EmojiParser.removeEmojis(str, collection)); 

Sortie

 // Prints: // "An awesome ssortingng with a few emojis!" // "An awesome ssortingng with a few 😉emojis!" // "An 😀awesome 😃ssortingng with a few emojis!" 

Comment l’obtenir?

Via Maven:

  com.vdurmont emoji-java 4.0.0  

Via Gradle:

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