string - Remova βœ…, πŸ”₯, ✈, β™› e outros tais emojis / imagens / sinais da cadeia Java




(7)

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.

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 ?


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)

ICU4J é seu amigo.

UCharacter.hasBinaryProperty(UProperty.EMOJI);

Lembre-se de manter sua versão do icu4j atualizada e observe que isso filtrará apenas os emojis Unicode oficiais, não os caracteres de símbolos. Combine com a filtragem de outros tipos de caracteres, conforme desejado.

Mais informações: http://icu-project.org/apiref/icu4j/com/ibm/icu/lang/UProperty.html#EMOJI


Eu dei alguns exemplos abaixo, e pensei que o latim é suficiente, mas ...

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

Após a edição, desenvolveu uma nova solução, usando o método Character.getType , e essa parece ser a melhor solução para isso.

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);
        }
    }

}

Saída:

---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
ζ—©δΈŠε₯½ β™›
ζ—©δΈŠε₯½ 
ΚαλημΞ­ρα βœ‚
ΚαλημΞ­ρα 

O código funciona transmitindo a string para os pontos de código. Em seguida, usando lambdas para filtrar caracteres em uma matriz int , convertemos a matriz em String.

As letras e os espaços estão usando os métodos Character para filtrar, não bons com pontuação. Tentativa falhada .

O unicode bloqueia o filtro branco usando os blocos unicode que o programador especifica como permitido. Tentativa falhada .

O unicode bloqueia o filtro preto usando os blocos unicode que o programador especifica como não permitidos. Tentativa falhada .

O filtro de categoria usando o método estático Character.getType . O programador pode definir no array de category quais tipos são permitidos. TRABALHOS πŸ˜¨πŸ˜±πŸ˜°πŸ˜²πŸ˜€.


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.


Dentro de um construtor, você pode usar a palavra-chave this para invocar outro construtor na mesma classe. Fazer isso é chamado de invocação de construtor explícito .

Aqui está outra classe Rectangle, com uma implementação diferente daquela na seção Objects.

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(1, 1);
    }
    public Rectangle(int width, int height) {
        this( 0,0,width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

}

Esta classe contém um conjunto de construtores. Cada construtor inicializa algumas ou todas as variáveis ​​de membro do retângulo.





java string emoji