2010-06-16 7 views
2

Comment dois-je procéder pour implémenter une méthode qui obtient une chaîne composée de caractères latins pour la traduire en une chaîne composée d'un ensemble de caractères différent, disons cyrillique.Traduction de chaînes de caractères caractère par caractère

Voilà comment cela se fait en PHP par exemple:

function latin_to_cyrillic($string) 
{ 
$array = array(
    "а" => "a", 
    "б" => "b", 
    "в" => "v", 
    "г" => "g", 
    "д" => "d", 
    "е" => "e", 
    "ж" => "zh", 
    "з" => "z", 
    "и" => "i", 
    "й" => "y", 
    "к" => "k", 
    "л" => "l", 
    "м" => "m", 
    "н" => "n", 
    "о" => "o", 
    "п" => "p", 
    "р" => "r", 
    "с" => "s", 
    "т" => "t", 
    "у" => "u", 
    "ф" => "f", 
    "х" => "h", 
    "ц" => "ts", 
    "ч" => "ch", 
    "ш" => "sh", 
    "щ" => "sht", 
    "ь" => "y", 
    "ъ" => "a", 
    "ю" => "yu", 
    "я" => "ya", 
    "А" => "A", 
    "Б" => "B", 
    "В" => "V", 
    "Г" => "G", 
    "Д" => "D", 
    "Е" => "E", 
    "Ж" => "Zh", 
    "З" => "Z", 
    "И" => "I", 
    "Й" => "Y", 
    "К" => "K", 
    "Л" => "L", 
    "М" => "M", 
    "Н" => "N", 
    "О" => "O", 
    "П" => "P", 
    "Р" => "R", 
    "С" => "S", 
    "Т" => "T", 
    "У" => "U", 
    "Ф" => "F", 
    "Х" => "H", 
    "Ц" => "Ts", 
    "Ч" => "Ch", 
    "Ш" => "Sh", 
    "Щ" => "Sht", 
    "Ь" => "Y", 
    "Ъ" => "A", 
    "Ю" => "Yu", 
    "Я" => "Ya", 
    "–" => "-"); 

return str_replace(array_values($array), array_keys($array), $string); 

} 
+1

Votre question est mal définie. Les termes "caractères latins" et "caractères cyrilliques" sont mal spécifiés: il existe de nombreux jeux de caractères "latins" et "cyrilliques". Si vous pensez à quelque chose de spécifique, comme deux jeux de caractères Windows spécifiques, veuillez le dire dans votre question. En Java, Strings utilise Unicode, pas de tels jeux de caractères, donc la question formulée n'a pas de sens, et vous aurez probablement besoin de translittérations de/vers de tels jeux de caractères et Unicode. – reinierpost

+0

@reinierpost L'OP utilise l'exemple PHP pour spécifier les caractères latins et cyrilliques qu'il s'intéresse à la 'traduction' –

Répondre

4

tout d'abord vous avez besoin d'une table de conversion, la définition de la traduction pour chaque caractère.

Ensuite, vous lisez la chaîne char par char, et utilisez la table de traduction pour obtenir la traduction. Facile, non?

vous pouvez utiliser quelque chose comme ceci:

class Translator { 
HashMap<String,String> translation = new HashMap<String,String>(); 

public Translator(){ 
    //Populate the translation table here; 
} 

public String translate(String origin){ 
    String destiny=""; 
    for(int i=0;i<origin.length();i++){ 
    char character = origin.charAt(i); 
    destiny = destiny + translation.get(Character.toString(character)); 
    } 
return destiny; 
} 
} 

Sinon, vous pouvez utiliser

replaceEach(String text, String[] searchList, String[] replacementList) 
      Replaces all occurrences of Strings within another String. 

De org.apache.commons.lang.StringUtils. Vous pouvez remplir un String[] avec les caractères latins (mais en tant que String), puis remplir un autre String[] avec les caractères cyrilliques String et utiliser cette fonction.

String[] latinCharacters = [] //Populate them 
String[] cyrillicCharacters = [] //Populate them 

public String translate(String origin){ 
return replaceEach(origin,latinCharacters,cyrillicCharacters); 
} 
+2

Il n'y a pas de classe Java nommée HashTable, seulement HashMap et une Hashtable obsolète. Et aucun de ceux-ci ne peut être paramétré avec le char primitif. Corrigez cela, s'il vous plaît. –

+1

Ne réussit pas le test d'odeur. 'Hashtable' devrait être évité dans presque toutes les circonstances, et à la place' HashMap' utilisé. Vous ne pouvez pas utiliser les types primitifs pour les génériques. 'destiny' est presque certain de courir dans' IndexOutOfBoundsException'. La question implique éventuellement de mapper un personnage à plusieurs caractères. – Mike

+0

Fixé en fonction des commentaires @Michael. Je l'ai fait par coeur afin qu'il puisse avoir l'idée de comment le faire. – pakore

Questions connexes