2010-06-16 95 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