web-dev-qa-db-fra.com

Supprimez les chaînes ✅, ????, ✈, ♛ et autres tels émojis / images / signes de Java

J'ai des chaînes avec toutes sortes de différents emojis/images/signes en eux.

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 garder que les lettres (et la ponctuation) dans les différentes langues.

J'ai essayé de nettoyer les panneaux en utilisant le bibliothèque EmojiParser :

String withoutEmojis = EmojiParser.removeAllEmojis(input);

Le problème est qu’EmojiParser n’est pas en mesure d’enlever la majorité des panneaux. Le signe ♦ est le seul que j’ai trouvé jusqu’à présent qui l’ait enlevé. D'autres signes tels que ❉ ★ ✰ ❈ ❧ ♛ ♛ ✿ ♛ ♛ ???? ne sont pas supprimés.

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

191
riorio

Au lieu de mettre certains éléments sur la liste noire, 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é.

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

Alors:

  • [\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s] est une plage représentant tous les numériques (\\p{N}), les lettres (\\p{L}), les repères (\\p{M}), les signes de ponctuation (\\p{P}), les espaces blancs/les séparateurs ( \\p{Z}), autre formatage (\\p{Cf}) et autres caractères supérieurs à U+FFFF en Unicode (\\p{Cs}) et caractères de nouvelle ligne (\\s). \\p{L} spécifiquement inclut les caractères d'autres alphabets tels que cyrillique, latin, kanji, etc.
  • Le ^ dans le jeu de caractères regex annule la correspondance.

Exemple:

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

Si vous avez besoin de plus d'informations, consultez la Java documentation pour les expressions rationnelles.

286
Nick Bull

Je ne suis pas très doué pour Java, je ne vais donc pas essayer d'écrire un exemple de code en ligne, mais je le ferais pour vérifier ce que Unicode appelle "la catégorie générale" de chaque caractère. Il existe quelques 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 spécifiés comme souhaitant spécifiquement supprimer ont la catégorie générale OTHER_SYMBOL, que je n'ai pas incluse dans la liste blanche de la catégorie ci-dessus.)

81
Daniel Wagner

Basé sur liste complète Emoji, v11. vous avez 1644 points de code Unicode différents à supprimer. Par exemple, __ est dans cette liste en tant que U+2705 .

Ayant la liste complète des émoticônes, vous devez les filtrer en utilisant points de code . Itérer sur un seul char ou byte ne fonctionnera pas, car un seul point de code peut s'étendre sur plusieurs octets. Étant donné que Java utilise UTF-16, les émoticônes prennent généralement deux chars.

_String 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 à partir du point de code Unicode _U+2705_ sur Java int est simple:

_int viSign = 0x2705;
_

ou puisque Java prend en charge les chaînes Unicode:

_int viSign = "✅".codePointAt(0);
_
47
Karol Dowbecki

ICU4J est votre ami.

UCharacter.hasBinaryProperty(UProperty.EMOJI);

N'oubliez pas de garder votre version d'icu4j à jour et notez que cela ne fera que filtrer les emoji Unicode officiels, pas les caractères symboliques. 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

20
Daniel F

J'ai donné quelques exemples ci-dessous et je pensais 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 l’édition, nous avons mis au point une nouvelle solution à l’aide de la méthode Character.getType. Cette solution semble être la meilleure.

package zmarcos.emoji;

import Java.util.Arrays;
import Java.util.HashSet;
import Java.util.Set;

public class TestEmoji {

    public static void main(String[] args) {
        String[] arr = {"Remove ✅, ????, ✈ , ♛ and other such signs from Java string",
            "→ 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 (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> Character.isLetter(cp) || Character.isWhitespace(cp)).toArray();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }

        System.out.println("\n---unicode blocks white---\n");
        Set<Character.UnicodeBlock> 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();
            String result = new String(filtered, 0, filtered.length);
            System.out.println(input);
            System.out.println(result);
        }

        System.out.println("\n---unicode blocks black---\n");
        Set<Character.UnicodeBlock> 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();
            String result = new String(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 (String input : arr) {
            int[] filtered = input.codePoints().filter((cp) -> Arrays.binarySearch(category, Character.getType(cp)) >= 0).toArray();
            String result = new String(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 string
Remove      and other such signs from Java string
→ 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 string
Remove , ,  ,  and other such signs from Java string
→ 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 string
Remove , ,  ,  and other such signs from Java string
→ 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 string
Remove , ,  ,  and other such signs from Java string
→ 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 transmettant la chaîne à des points de code. Ensuite, en utilisant lambdas pour filtrer les caractères dans un tableau int, nous convertissons le tableau en chaîne.

Les lettres et espaces utilisent les méthodes de caractères pour filtrer, ce qui n’est pas bon pour la ponctuation. tentative infructueuse.

Le filtre nicode bloque en blanc utilise les blocs unicode spécifiés par le programmeur. tentative infructueuse.

Le filtre nicode block black utilise les blocs unicode spécifiés par le programmeur comme étant interdits. tentative infructueuse.

Le filtre catégorie utilise la méthode statique Character.getType. Le programmeur peut définir dans le tableau category les types autorisés. FONCTIONNE ????????????????????.

10
Marcos Zolnowski

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

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

C'est le mode rapide qui risque de manquer certains émoticônes, car il utilise des algorithmes heuristiques pour rechercher des émoticônes dans le texte. Utilisez la méthode .full() pour analyser la chaîne entière et supprimer tous les émojis garantis.

Essayez ce projet simple-emoji-4j

Compatible avec Emoji 12.0 (2018.10.15)

Simple avec:

EmojiUtils.removeEmoji(str)
0
liheyuan