.NET字符串将俄语替换为英语

时间:2010-05-14 16:05:21

标签: c# string utf-8 replace

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

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

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

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

3 个答案:

答案 0 :(得分: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();
    }

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

United Nations document可能会有所帮助。

答案 1 :(得分: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,因此可以将其替换为俄语单词。

答案 2 :(得分:-1)

很奇怪

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

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