.NET строка заменяет русский на английский - PullRequest
1 голос
/ 14 мая 2010

У меня странная проблема с заменой символов в строке ...

Я читаю файл .txt, содержащий русский текст, и, начиная со списка букв с русского на английский (ru = en), зацикливаю список и хочу заменить русские символы английскими.

Проблема в том, что в отладке я вижу правильное чтение русского и правильное чтение английского, но при использовании myWord = myWord.Replace(ruChar, enChar) строка не заменяется .

Мой текстовый файл имеет кодировку UTF-8.

Ответы [ 3 ]

4 голосов
/ 14 мая 2010

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 () необходимы для латинской замены, поскольку для некоторых букв кириллицы требуется более одной буквы для их транслитерации. Основная идея заключается в использовании словаря для быстрого поиска и строителя строк для быстрого построения строк.

Этот документ Организации Объединенных Наций может быть полезным.

0 голосов
/ 14 мая 2010

Очень странно

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

Работает как запланировано. Возможно, потому что я установил русский язык как язык системы, не поддерживающий Юникод

0 голосов
/ 14 мая 2010

Не -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, чтобы его можно было заменить на русское слово.

...