Le problème est que, comme vous le savez, il y a des milliers de caractères dans le graphique Unicode et je veux convertir tous les caractères similaires en lettres qui sont en alphabet anglais.
Par exemple, voici quelques conversions:
ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...
et j'ai vu qu'il existe plus de 20 versions de la lettre A / a. et je ne sais pas comment les classer. Ils ressemblent à des aiguilles dans la botte de foin.
La liste complète des caractères Unicode se trouve à http://www.ssec.wisc.edu/~tomw/java/unicode.html ou http://unicode.org/charts/charindex.html . Essayez simplement de faire défiler vers le bas et de voir les variations de lettres.
Comment puis-je convertir tout cela avec Java? Aidez-moi, s'il vous plaît :(
java
unicode
special-characters
diacritics
AhmetB - Google
la source
la source
Réponses:
Republier mon message depuis Comment supprimer les signes diacritiques (accents) d'une chaîne dans .NET?
Cette méthode fonctionne très bien en java (uniquement dans le but de supprimer les signes diacritiques aka accents) .
Il convertit fondamentalement tous les caractères accentués en leurs homologues désaccentués, suivis de leur combinaison de signes diacritiques. Vous pouvez maintenant utiliser une expression régulière pour supprimer les signes diacritiques.
la source
Il fait partie d' Apache Commons Lang à partir de la ver. 3.0.
Retour
An
Voir également http://www.drillio.com/en/software-development/java/removing-accents-diacritics-in-any-language/
la source
Tenter de «tous les convertir» est une mauvaise approche du problème.
Tout d'abord, vous devez comprendre les limites de ce que vous essayez de faire. Comme d'autres l'ont souligné, les signes diacritiques sont là pour une raison: ce sont essentiellement des lettres uniques dans l'alphabet de cette langue avec leur propre signification / son, etc.: supprimer ces marques équivaut à remplacer des lettres aléatoires dans un mot anglais. C'est avant même de commencer à considérer les langues cyrilliques et d'autres textes basés sur des scripts tels que l'arabe, qui ne peuvent tout simplement pas être «convertis» en anglais.
Si vous devez , pour une raison quelconque, convertir des caractères, alors la seule façon raisonnable de l'aborder est de réduire d'abord la portée de la tâche à accomplir. Considérez la source de l'entrée - si vous codez une application pour "le monde occidental" (pour utiliser une phrase aussi bonne que n'importe quelle autre), il est peu probable que vous ayez jamais besoin d'analyser les caractères arabes. De même, le jeu de caractères Unicode contient des centaines de symboles mathématiques et illustrés: il n'y a pas de moyen (facile) pour les utilisateurs de les saisir directement, vous pouvez donc supposer qu'ils peuvent être ignorés.
En suivant ces étapes logiques, vous pouvez réduire le nombre de caractères possibles à analyser au point où une opération de recherche / remplacement basée sur le dictionnaire est possible. Cela devient alors une petite quantité de travail légèrement ennuyeux pour créer les dictionnaires, et une tâche triviale pour effectuer le remplacement. Si votre langage prend en charge les caractères Unicode natifs (comme le fait Java) et optimise correctement les structures statiques, cette recherche et ces remplacements ont tendance à être incroyablement rapides.
Cela vient de l'expérience d'avoir travaillé sur une application qui était nécessaire pour permettre aux utilisateurs finaux de rechercher des données bibliographiques contenant des caractères diacritiques. Les tableaux de recherche (comme c'était le cas dans notre cas) ont pris peut-être 1 jour d'homme à produire, pour couvrir toutes les marques diacritiques de toutes les langues d'Europe occidentale.
la source
Puisque le codage qui transforme «la famille» en «tђє Ŧ ค ๓ เ ℓy» est effectivement aléatoire et ne suit aucun algorithme qui peut être expliqué par les informations des points de code Unicode impliqués, il n'y a pas de moyen général de résoudre ce problème de manière algorithmique.
Vous devrez construire le mappage des caractères Unicode en caractères latins auxquels ils ressemblent. Vous pourriez probablement le faire avec un apprentissage automatique intelligent sur les glyphes réels représentant les points de code Unicode. Mais je pense que l'effort pour cela serait plus grand que la construction manuelle de cette cartographie. Surtout si vous disposez d'une bonne quantité d'exemples à partir desquels vous pouvez construire votre cartographie.
Pour clarifier: quelques-unes des substitutions peuvent en fait être résolues via les données Unicode (comme le montrent les autres réponses), mais certaines lettres n'ont tout simplement aucune association raisonnable avec les caractères latins auxquels elles ressemblent.
Exemples:
la source
La demande d'origine a déjà reçu une réponse.
Cependant, je publie la réponse ci-dessous pour ceux qui pourraient rechercher un code de translittération générique pour translittérer n'importe quel jeu de caractères en latin / anglais en Java.
Signification naïve de la traduction: la chaîne traduite dans sa forme finale / jeu de caractères cible sonne comme la chaîne dans sa forme originale. Si nous voulons translittérer n'importe quel jeu de caractères en latin (alphabets anglais), alors ICU4 (bibliothèque ICU4J en java) fera le travail.
Voici l'extrait de code en java:
la source
Corde testée: ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝß
Testé:
Le dernier choix est le meilleur.
la source
Si le besoin est de convertir "òéışöç-> oeisoc", vous pouvez utiliser ceci comme point de départ:
Le JDK 1.6 fournit la classe java.text.Normalizer qui peut être utilisée pour cette tâche.
Voir un exemple ici
la source
Vous pouvez essayer d'utiliser
unidecode
, qui est disponible en tant que gemme ruby et en tant que module perl sur cpan . Essentiellement, cela fonctionne comme une énorme table de recherche, où chaque point de code Unicode se rapporte à un caractère ou une chaîne ascii.la source
Il n'y a pas de moyen facile ou général de faire ce que vous voulez, car c'est juste votre opinion subjective que ces lettres ressemblent aux lettres latines vers lesquelles vous voulez convertir. Ce sont en fait des lettres séparées avec leurs propres noms et sons distincts qui ressemblent simplement à une lettre latine.
Si vous voulez cette conversion, vous devez créer votre propre table de traduction en fonction des lettres latines vers lesquelles vous pensez que les lettres non latines doivent être converties.
(Si vous souhaitez uniquement supprimer les signes diacritiques, il y a quelques réponses dans ce fil: Comment supprimer les signes diacritiques (accents) d'une chaîne dans .NET? Cependant, vous décrivez un problème plus général)
la source
Je suis en retard à la fête, mais après avoir affronté ce problème aujourd'hui, j'ai trouvé cette réponse très bonne:
Référence: https://stackoverflow.com/a/16283863
la source
Le problème de la «conversion» de l'Unicode arbitraire en ASCII est que la signification d'un caractère dépend de la culture. Par exemple, «ß» pour une personne de langue allemande devrait être converti en «ss» alors qu'un anglophone le convertirait probablement en «B».
Ajoutez à cela le fait qu'Unicode a plusieurs points de code pour les mêmes glyphes.
Le résultat est que la seule façon de le faire est de créer une table massive avec chaque caractère Unicode et le caractère ASCII vers lequel vous souhaitez le convertir. Vous pouvez prendre un raccourci en normalisant les caractères avec des accents au formulaire de normalisation KD, mais tous les caractères ne se normalisent pas en ASCII. De plus, Unicode ne définit pas quelles parties d'un glyphe sont des «accents».
Voici un petit extrait d'une application qui fait cela:
la source
La classe suivante fait l'affaire:
la source