O problema é que, como você sabe, existem milhares de caracteres no gráfico Unicode e desejo converter todos os caracteres semelhantes nas letras que estão no alfabeto inglês.
Por exemplo, aqui estão algumas conversões:
ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...
e vi que existem mais de 20 versões da letra A / a. e eu não sei como classificá-los. Eles parecem agulhas no palheiro.
A lista completa de caracteres unicode está em http://www.ssec.wisc.edu/~tomw/java/unicode.html ou http://unicode.org/charts/charindex.html . Apenas tente rolar para baixo e ver as variações de letras.
Como posso converter tudo isso com Java? Por favor me ajude :(
java
unicode
special-characters
diacritics
AhmetB - Google
fonte
fonte
Respostas:
Reposicionando minha postagem de Como removo sinais diacríticos (acentos) de uma string no .NET?
Este método funciona bem em java (puramente com a finalidade de remover marcas diacríticas, também conhecidas como acentos) .
Basicamente, converte todos os caracteres acentuados em seus equivalentes descentralizados, seguidos pelos diacríticos combinados. Agora você pode usar uma regex para retirar os sinais diacríticos.
fonte
É uma parte do Apache Commons Lang a partir do ver. 3.0
retorna
An
Consulte também http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/
fonte
Tentar "convertê-los todos" é a abordagem errada para o problema.
Primeiro, você precisa entender as limitações do que você está tentando fazer. Como outros salientaram, os diacríticos existem por uma razão: são essencialmente letras únicas no alfabeto dessa língua com seu próprio significado / som, etc .: remover essas marcas é o mesmo que substituir letras aleatórias em uma palavra em inglês. Isso é antes mesmo de você considerar os idiomas cirílicos e outros textos baseados em scripts, como o árabe, que simplesmente não podem ser "convertidos" para o inglês.
Se , por qualquer motivo, você precisar converter caracteres, a única maneira sensata de abordar isso é reduzir primeiro o escopo da tarefa em questão. Considere a fonte da entrada - se você estiver codificando um aplicativo para "o mundo ocidental" (para usar uma frase tão boa quanto qualquer outra), é improvável que você precise analisar caracteres árabes. Da mesma forma, o conjunto de caracteres Unicode contém centenas de símbolos matemáticos e pictóricos: não existe uma maneira (fácil) de os usuários inseri-los diretamente, portanto, você pode assumir que eles podem ser ignorados.
Ao seguir estas etapas lógicas, você pode reduzir o número de caracteres possíveis para analisar até o ponto em que uma operação de pesquisa / substituição baseada em dicionário é viável. Em seguida, torna-se uma pequena quantidade de trabalho um pouco chato, criando os dicionários, e uma tarefa trivial para executar a substituição. Se o seu idioma suportar caracteres Unicode nativos (como o Java faz) e otimizar estruturas estáticas corretamente, essas localizações e substituições tendem a ser incrivelmente rápidas.
Isso resulta da experiência de ter trabalhado em um aplicativo necessário para permitir que os usuários finais pesquisassem dados bibliográficos que incluíam caracteres diacríticos. As matrizes de pesquisa (como no nosso caso) levaram talvez um dia para serem produzidas, para cobrir todas as marcas diacríticas de todas as línguas da Europa Ocidental.
fonte
Como a codificação que transforma "a Família" em "tђє Ŧ ค ๓ เ ℓy" é efetivamente aleatória e não segue nenhum algoritmo que possa ser explicado pelas informações dos pontos de código Unicode envolvidos, não há uma maneira geral de resolver isso algoritmicamente.
Você precisará criar o mapeamento de caracteres Unicode em caracteres latinos com os quais eles se assemelham. Você provavelmente poderia fazer isso com algum aprendizado de máquina inteligente sobre os glifos reais que representam os pontos de código Unicode. Mas acho que o esforço para isso seria maior do que construir manualmente esse mapeamento. Especialmente se você tiver uma boa quantidade de exemplos a partir dos quais poderá criar seu mapeamento.
Para esclarecer: algumas substituições podem realmente ser resolvidas através dos dados Unicode (como as outras respostas demonstram), mas algumas letras simplesmente não têm associação razoável com os caracteres latinos com os quais se parecem.
Exemplos:
fonte
A solicitação original já foi respondida.
No entanto, estou postando a resposta abaixo para aqueles que possam estar procurando por código de transliteração genérico para transliterar qualquer conjunto de caracteres para latim / inglês em Java.
Significado ingênuo da tranliteração: a string traduzida em sua forma final / conjunto de caracteres de destino soa como a string em sua forma original. Se quisermos transliterar qualquer conjunto de caracteres para o latim (alfabetos em inglês), o ICU4 (biblioteca ICU4J em java) fará o trabalho.
Aqui está o trecho de código em java:
fonte
Cadeia testada: ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß
Testado:
A última escolha é a melhor.
fonte
Se for necessário converter "òéışöç-> oeisoc", você pode usar isso como um ponto de partida:
O JDK 1.6 fornece a classe java.text.Normalizer que pode ser usada para esta tarefa.
Veja um exemplo aqui
fonte
Você pode tentar usar
unidecode
, que está disponível como uma gema de rubi e como um módulo perl no cpan . Essencialmente, ele funciona como uma enorme tabela de pesquisa, na qual cada ponto de código unicode se relaciona a um caractere ou string ascii.fonte
Não há uma maneira fácil ou geral de fazer o que você deseja, porque é apenas a sua opinião subjetiva de que essas letras parecem ser as letras latinas nas quais você deseja converter. Na verdade, são letras separadas com seus próprios nomes e sons distintos, que superficialmente parecem uma letra latina.
Se você deseja essa conversão, deve criar sua própria tabela de tradução com base em quais letras latinas você acha que as letras não latinas devem ser convertidas.
(Se você deseja remover apenas marcas diacritiais, há algumas respostas neste segmento: Como remover diacríticos (acentos) de uma cadeia de caracteres no .NET? No entanto, você descreve um problema mais geral)
fonte
Estou atrasado para a festa, mas depois de enfrentar esse problema hoje, achei esta resposta muito boa:
Referência: https://stackoverflow.com/a/16283863
fonte
O problema com a "conversão" arbitrária de Unicode para ASCII é que o significado de um caractere depende da cultura. Por exemplo, “ß” para uma pessoa que fala alemão deve ser convertido para "ss", enquanto um falante de inglês provavelmente o converterá em "B".
Acrescente a isso o fato de o Unicode ter vários pontos de código para os mesmos glifos.
O resultado é que a única maneira de fazer isso é criar uma tabela enorme com cada caractere Unicode e o caractere ASCII no qual você deseja convertê-lo. Você pode usar um atalho normalizando caracteres com acentos no formulário de normalização KD, mas nem todos os caracteres normalizam para ASCII. Além disso, o Unicode não define quais partes de um glifo são "acentos".
Aqui está um pequeno trecho de um aplicativo que faz isso:
fonte
A classe a seguir faz o truque:
fonte