2010-06-16 173 views
2

我应该如何去实现一种方法,该方法获取由拉丁字符组成的字符串,将其转换为由不同字符集组成的字符串,例如西里尔字母。按字符翻译字符串

下面是它是如何在PHP中完成,例如:

所有的
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

你的问题是不明确的。术语“拉丁字符”和“西里尔文字符”不明确:存在许多不同的“拉丁”和“西里尔字母”字符集。如果你正在考虑特定的东西,比如两个特定的Windows字符集,请在你的问题中这么说。在Java中,Strings使用Unicode,而不是任何这样的字符集,所以制定的问题没有意义,并且您可能需要从这些字符集和Unicode转换成/。 – reinierpost 2010-06-16 08:15:54

+0

@reinierpost OP使用PHP示例指定他感兴趣的拉丁字母和西里尔字符'翻译' – 2017-06-25 18:23:15

回答

4

首先你需要一个转换表,确定翻译为每个字符。

然后,您通过char读取字符串char,并使用翻译表来获取翻译。很简单,对吧?

你可以使用这样的事情:

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; 
} 
} 

另外,您可以使用

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

org.apache.commons.lang.StringUtils。 您可以使用拉丁字符(但是为String)填充String[],然后使用西里尔文字符填充另一个String[],并使用该函数。

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

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

没有Java类名为HashTable,只有HashMap和过时的Hashtable。这些都不能用原始字符参数化。请纠正这一点。 – 2010-06-16 08:30:58

+1

不通过气味测试。几乎在所有情况下都应避免使用“Hashtable”,而使用“HashMap”。您不能使用泛型的基本类型。 'destiny'几乎肯定会遇到'IndexOutOfBoundsException'。这个问题涉及到可能将一个字符映射到多个字符。 – Mike 2010-06-16 08:36:03

+0

根据@Michael评论修正。我是这么做的,所以他可以知道如何去做。 – pakore 2010-06-16 08:40:07