2010-05-14 57 views
1

我有一個奇怪的問題串置換字符....NET字符串替換俄語到英語

我讀取包含俄文本.txt文件,並從以英文字母俄語列表(RU = EN開始),我循環列表,我想用俄文字符替換俄文字符。

問題是:我可以在調試中看到正確的閱讀俄文和正確的閱讀英文,但使用myWord = myWord.Replace(ruChar, enChar)字符串不被替換

我的txt文件是UTF-8編碼。

+2

請向我們展示代碼和文件。 – SLaks 2010-05-14 16:08:42

+0

而myWord.IndexOf(ruChar)返回-1 ...?我首先將兩者轉換爲char []並通過特徵檢查它們的特徵。 – 2010-05-14 17:18:05

回答

0

不要-1我,如果這不工作,我只是猜測,你必須UTF-8,你要替換,像這樣的例子英文字符串:

string myWord = Encoding.UTF8.GetString(Encoding.ASCII.GetBytes(myWord)); 
myWord = myWord.Replace("слово", Encoding.UTF8.GetString(Encoding.ASCII.GetBytes("letter"))); 

我假設myWord是ASCII碼,因此第一行代碼將其轉換爲UTF-8字符串,但如果它是UTF-8則將其忽略。

第二行將英文單詞轉換爲UTF-8,因此它可以替換爲俄文單詞。

-1

很奇怪

Console.WriteLine("слово".Replace("слово", "word")); // prints 'word' 

工程按計劃進行。也許是因爲我把俄語設置爲非Unicode系統語言。

+0

不適合我...我在塞爾維亞也是這樣做的......系統設置很好,我猜。 = D而且,SLOVO表示信件,而不是WORD。 = p – Cipi 2010-05-14 16:41:43

+0

Slovo意思是字,Bukva是字母... – 2010-05-14 16:48:16

+0

@Cipi:在塞爾維亞語中,是的,是指。在俄語 - слово(字),буква(字母):) – abatishchev 2010-05-16 10:42:19

4

String.Replace()將會非常低效,您必須爲每個可能要替換的西裏爾字母調用它。使用字典,而不是(雙關語意圖)。例如:

private const string Cyrillic = "AaБбВвГг..."; 
    private const string Latin = "A|a|B|b|V|v|G|g|..."; 
    private Dictionary<char, string> mLookup; 

    public string Romanize(string russian) { 
     if (mLookup == null) { 
      mLookup = new Dictionary<char, string>(); 
      var replace = Latin.Split('|'); 
      for (int ix = 0; ix < Cyrillic.Length; ++ix) { 
       mLookup.Add(Cyrillic[ix], replace[ix]); 
      } 
     } 
     var buf = new StringBuilder(russian.Length); 
     foreach (char ch in russian) { 
      if (mLookup.ContainsKey(ch)) buf.Append(mLookup[ch]); 
      else buf.Append(ch); 
     } 
     return buf.ToString(); 
    } 

注意的酒吧和分割()函數如何是必要的,拉丁更換,因爲一些西裏爾字母需要爲他們的音譯多個字母。主要思想是使用字典進行快速查找,並使用字符串生成器來快速構建字符串。

United Nations document可能會對您有所幫助。

+0

純粹挑剔,但TryGetValue()比ContainsKey()更適合,我認爲 – 2010-07-16 14:35:11