【问题标题】:.NET string replace russian to english.NET 字符串将俄语替换为英语
【发布时间】:2011-02-19 14:35:57
【问题描述】:

我在替换字符串中的字符时遇到了一个奇怪的问题...

我阅读了一个包含俄语文本的 .txt 文件,从俄语到英语 (ru=en) 的字母列表开始,我循环该列表,我想用英语字符替换俄语字符。

问题是:我在调试中可以看到俄语的正确阅读和英语的正确阅读,但是使用myWord = myWord.Replace(ruChar, enChar) 字符串没有被替换

我的 txt 文件是 UTF-8 编码。

【问题讨论】:

  • 请向我们展示代码和文件。
  • 而 myWord.IndexOf(ruChar) 返回 -1...?我首先将两者都转换为 char[] 并逐个字符地检查它们。

标签: c# string utf-8 replace


【解决方案1】:

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

请注意,在拉丁语替换中,横杠和 Split() 函数是必要的,因为某些西里尔字母的音译需要多个字母。关键思想是使用字典进行快速查找,使用字符串构建器进行快速字符串构造。

这个United Nations document 可能会有所帮助。

【讨论】:

  • 纯属吹毛求疵,但我认为 TryGetValue() 会比 ContainsKey() 更适合
【解决方案2】:

如果这不起作用,请不要 -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,因此可以替换俄语单词。

【讨论】:

    【解决方案3】:

    很奇怪

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

    按计划工作。也许是因为我将俄语设置为非 unicode 系统语言..

    【讨论】:

    • 对我不起作用...我在塞尔维亚语中也做了同样的事情...我猜是系统设置。 =D 而且,SLOVO 的意思是 LETTER,而不是 WORD。 =p
    • @Cipi:在塞尔维亚语中是的,意思是。俄语 - слово(单词),буква(字母):)