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 muito mais.
Gostaria de me livrar de todos esses sinais / imagens e manter apenas as letras (e pontuação) nos diferentes idiomas.
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 seqüências de caracteres de entrada e mantendo apenas as letras e a pontuação nos diferentes idiomas ?
Respostas:
Em vez de colocar alguns elementos na lista negra, que tal criar uma lista branca dos personagens que você deseja manter? Dessa forma, você não precisa se preocupar com a adição de novos emojis.
Assim:
[\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\p{Cs}\\s]
é um intervalo que representa todos os caracteres 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 acimaU+FFFF
nos caracteres Unicode (\\p{Cs}
) e nova linha (\\s
). inclui\\p{L}
especificamente os caracteres de outros alfabetos, como cirílico, latino, kanji etc.^
conjunto de caracteres regex nega a correspondência.Exemplo:
Se precisar de mais informações, consulte a documentação do Java para regexes.
fonte
[^\w\^\-\[\]\.!@#$%&*\(\)/+'":;~?,]
mas sou apenas eu sendo robusta e tentando coletar todos os personagens típicos que não são símbolos). Promovido porque esta é definitivamente uma solução potencial. Se ele quiser adicionar outros caracteres de idioma, ele poderá adicioná-los à expressão conforme necessário.p{L}
lida com caracteres alfabéticos não ingleses . Espero que entenda que não consigo listar extensivamente todos os alfabeto que não sejam o inglês na minha resposta, pois isso seria impraticável."[^\\p{L}\\p{M}\\p{N}\\p{P}\\p{Z}\\p{Cf}\\s]"
. Isso permite as categorias gerais Carta, Marca, Número, Pontuação, Separador e "Outros, Formato", além de caracteres de espaço em branco, como tabulação e nova linha.Eu não sou muito apaixonado por Java, então não tentarei escrever um exemplo de código embutido, mas a maneira como 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 nestas categorias gerais:
(Todos os caracteres que você listou como especificamente querendo remover têm categoria geral
OTHER_SYMBOL
, que eu não incluí na lista de permissões da categoria acima.)fonte
Character.getType()
não informará se seuchar
(ouint
ponto de código, pois o método está sobrecarregado) é, digamos, um emoticon ou um símbolo musical ou um caractere emoji, etc. Se você tiver um caso de uso simples, pode ser bom seguir esse caminho - certamente é uma abordagem elegante e fácil de entender -, mas lembre-se de que pode quebrar se os requisitos mudarem.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 comoU+2705
.Tendo a lista completa de emojis, você precisa filtrá-los usando pontos de código . A iteração sobre um único
char
oubyte
não funcionará, pois um ponto de código único pode abranger vários bytes. Como o Java usa emojis UTF-16, normalmente leva doischar
s.O mapeamento do ponto de código Unicode
U+2705
para Javaint
é direto:ou como o Java suporta Unicode Strings:
fonte
input.codePointAt
apenas olha para até 2 caracteres, o que é um limite superior constante. Também (o recém-adicionado)i += Character.charCount(cp)
pula todos os caracteres queinput.codePointAt
inspecionaram (menos 1 em alguns casos de canto).String.chars()
transmite caracteres, não pontos de código. Existe um método separadoString.codePoints()
para isso.ICU4J é seu amigo.
Lembre-se de manter sua versão do icu4j atualizada e observe que isso filtrará apenas emojis Unicode oficiais, não caracteres simbólicos. 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
fonte
Dei alguns exemplos abaixo e pensei que o latim é suficiente, mas ...
Após a edição, desenvolveu uma nova solução, usando o
Character.getType
método, e essa parece ser a melhor opção.Resultado:
O código funciona transmitindo a String para pontos de código. Em seguida, use lambdas para filtrar caracteres em um
int
matriz, convertemos a matriz em String.As letras e os espaços estão usando o método Character para filtrar, não é bom com pontuação. Falha na tentativa .
O unicode bloqueia o filtro branco usando os blocos unicode que o programador especifica conforme permitido. Falha na tentativa .
O unicode bloqueia o filtro preto usando os blocos unicode que o programador especifica como não permitido. Falha na tentativa .
O filtro de categoria usando o método estático
Character.getType
. O programador pode definir nacategory
matriz que tipos são permitidos. TRABALHOS 😨😱😰😲😀.fonte
import java.lang.Character.UnicodeBlock;
, entãoCharacter.UnicodeBlock
->UnicodeBlock
.white list
exemplo.Experimente este projeto simple-emoji-4j
Compatível com Emoji 12.0 (2018.10.15)
Simples com:
fonte
Use um plugin jQuery chamado RM-Emoji. Veja como funciona:
Esse é o modo rápido que pode perder alguns emojis, pois usa algoritmos heurísticos para encontrar emojis no texto. Use o
.full()
método para verificar a seqüência inteira e remover todos os emojis garantidos.fonte