142 votes

Conversion de symboles et de lettres accentuées en alphabet anglais

Le problème est que, comme vous le savez, il y a des milliers de caractères en Unicode graphique et je veux convertir tous les caractères similaires pour les lettres qui sont dans l'alphabet anglais.

Par exemple, ici sont quelques conversions:

ҥ->H
Ѷ->V
Ȳ->Y
Ǭ->O
Ƈ->C
tђє Ŧค๓เℓy --> the Family
...

et j'ai vu qu'il y a plus de 20 versions de la lettre A/un. 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 est à http://www.ssec.wisc.edu/~tomw/java/unicode.html ou http://unicode.org/charts/charindex.html . Juste essayer de faire défiler vers le bas et de voir les variations de lettres.

Comment puis-je convertir toutes ces avec Java? S'il vous plaît aider moi :(

209voto

hashable Points 1781

Reposter mon post de Comment puis-je supprimer les signes diacritiques (accents) à partir d'une chaîne .NET?

Cette méthode fonctionne très bien en java (uniquement pour but de supprimer les signes diacritiques aka accents).

Essentiellement, il convertit tous les caractères accentués dans leur deAccented homologues suivie par leur combinaison de signes diacritiques. Maintenant vous pouvez utiliser une expression régulière pour enlever les signes diacritiques.

import java.text.Normalizer;
import java.util.regex.Pattern;

public String deAccent(String str) {
    String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
    return pattern.matcher(nfdNormalizedString).replaceAll("");
}

78voto

Ondra Žižka Points 8262

C'est une partie de Apache Commons Lang à partir de ver. 3.1.

 org.apache.commons.lang3.StringUtils.stripAccents("Añ");
 

renvoie An

Voir aussi http://www.drillio.com/fr/software-development/java/removing-accents-diacritics-in-any-language/

19voto

iAn Points 3090

La tentative de "convertir" est la 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: ils sont essentiellement propres lettres dans l'alphabet de cette langue avec leur propre sens / son etc.: la suppression de ces marques est juste le même que le remplacement aléatoire de lettres dans un mot d'anglais. C'est avant même d'aller sur l'considérer les langues utilisant l'alphabet Cyrillique et d'autres scripts, textes, telles que l'arabe, qui simplement ne peut pas être "converti" en anglais.

Si vous devez, pour quelque raison que ce soit, de convertir les caractères, alors la seule façon rationnelle de l'approche de ce il à tout d'abord de réduire l'ampleur de la tâche à portée de main. Prendre en considération la source de l'entrée - le si vous êtes le codage d'une application pour "le monde Occidental" (à utiliser aussi bien une phrase que tout), il serait peu probable que vous avez besoin pour analyser les caractères arabes. De même, le jeu de caractères Unicode contenant des centaines de mathématiques et le dessin des symboles: il n'existe pas de moyen (facile) pour les utilisateurs d'entrer directement, de sorte que vous pouvez supposer qu'il peut être ignoré.

En prenant ces étapes logiques vous pouvez réduire le nombre de caractères possibles pour analyser au point où un dictionnaire de la fonction de recherche / remplacement opération est réalisable. Il devient alors une petite quantité de légèrement ennuyeux travail de création de dictionnaires, et une tâche triviale pour effectuer le remplacement. Si votre langue prend en charge les caractères Unicode (comme Java) et optimise les structures statiques correctement, comme trouver et remplace tendance à être absolument rapide.

Cela vient de l'expérience d'avoir travaillé sur une application qui a été nécessaire pour permettre aux utilisateurs finaux de rechercher les données bibliographiques qui comprenait des caractères diacritiques. La recherche de tableaux (comme il l'a été dans notre cas) a pris peut-être 1 jour à produire, afin de couvrir tous les signes diacritiques pour toutes les langues d'europe Occidentale.

16voto

Joachim Sauer Points 133411

Étant donné que le codage qui se transforme de "la Famille" en "tђє Ŧค๓เℓy" est effectivement aléatoire et non à la suite de l'algorithme qui peut être expliqué par les informations de l'Unicode codepoints impliqués, il n'y a pas de façon de résoudre ce problème de manière algorithmique.

Vous aurez besoin de construire la cartographie de l'Unicode des caractères en caractères latins qui ils ressemblent. Vous pourriez probablement faire ça avec des machines intelligentes de l'apprentissage sur les glyphes représentant de l'Unicode codepoints. Mais je pense que l'effort serait supérieure à créer manuellement que la cartographie. Surtout si vous avez une bonne quantité d'exemples à partir de laquelle vous pouvez construire votre cartographie.

Pour clarifier les choses: un peu de substitutions peuvent effectivement être résolu par les données Unicode (comme les autres réponses démontrer), mais certaines lettres n'ont tout simplement pas raisonnable association avec les caractères latins qui ils ressemblent.

Exemples:

  • "ђ" (U+0452 LETTRE minuscule CYRILLIQUE DJE) est plus liée à "d" que de "h", mais est utilisé pour représenter le "h".
  • """ (U+0166 LETTRE LATINE majuscule T AVC) est liée en quelque sorte à "T" (comme son nom l'indique), mais est utilisé pour représenter le "F".
  • "ค" (U+0E04 de CARACTÈRES THAÏ KHO KHWAI) n'est pas lié à un quelconque caractère latin à tous et dans votre exemple est utilisé pour représenter le "a"

5voto

Dour High Arch Points 11896

Le problème avec la "conversion" d'arbitraire Unicode en ASCII, c'est que le sens d'un personnage est la culture-dépendante. Par exemple, "ß" pour un germanophone personne devrait être converti en "ss" tout en un anglophone serait probablement le convertir en "beta".

Ajoutez à cela le fait que Unicode a de multiples 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 que vous souhaitez convertir. Vous pouvez prendre un raccourci en normalisant les caractères avec des accents à la forme de normalisation KD, mais pas tous les caractères de normaliser ASCII. En outre, Unicode ne pas définir les parties d'un glyphe sont des "accents".

Ici est un minuscule extrait à partir d'une application qui fait cela:

switch (c)
{
	case 'A':
	case '\u00C0':	//  À LATIN CAPITAL LETTER A WITH GRAVE
	case '\u00C1':	//  Á LATIN CAPITAL LETTER A WITH ACUTE
	case '\u00C2':	//  Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
	// and so on for about 20 lines...
		return "A";
		break;

	case '\u00C6'://  Æ LATIN CAPITAL LIGATURE AE
		return "AE";
		break;

	// And so on for pages...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X