2010-05-14 59 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