Задача такая. Есть слово. Например "Паранoрмальное". Одна из букв здесь написана на английской раскладке. Нужно определить раскладку слова (по наибольшему сосредоточию), выявить символы из другой раскладки (думаю, в UTF есть похожие символы не только между русской и английской раскладками) и заменить их на аналогичные по начертанию символы из раскладки, к которой принадлежит большинство символов. Не подскажете быстрый способ это сделать на языке C#?
Asked
Active
Viewed 410 times
2
2 Answers
1
Для поиска букв, относящихся к определённому языку, можно использовать именованные блоки регулярных выражений.
А вот таблицы перекодировки придётся составлять вручную (в примере только по две похожих буквы в словарях).
string text = "Паранoрмальное";
var basicLatinToCyrillicDictionary = new Dictionary<char, char>
{
['a'] = 'а',
['o'] = 'о'
};
var cyrillicToBasicLatinDictionary = new Dictionary<char, char>
{
['а'] = 'a',
['о'] = 'o'
};
string basicLatinPattern = @"\p{IsBasicLatin}";
string cyrillicPattern = @"\p{IsCyrillic}";
var basicLatinMatches = Regex.Matches(text, basicLatinPattern);
var cyrillicMatches = Regex.Matches(text, cyrillicPattern);
int basicLatinCount = basicLatinMatches.Count;
int cyrillicCount = cyrillicMatches.Count;
var sb = new StringBuilder(text);
if (cyrillicCount > basicLatinCount)
{
foreach (Match m in basicLatinMatches)
{
char basicLatinChar = m.Value[0];
char cyrillicChar = basicLatinToCyrillicDictionary[basicLatinChar];
sb.Replace(basicLatinChar, cyrillicChar, m.Index, 1);
}
}
else
{
// обратная замена
}
text = sb.ToString();
Console.WriteLine(text);
Если языков больше двух, то количество таблиц перекодировок становится устрашающим...
Присмотрелся я к диапазонам кодовых точек: судя по BasicLatin туда не только буквы попадают. Так что способ может не подойти.
Alexander Petrov
- 29,233
-
Конечно же языков может быть несколько. Очень много получится таких вот словарей. Возможно, лучше использовать не Dictionary тогда, а Tuple или DataTable? – iRumba May 06 '16 at 15:35
-
Да и как я буду вводить символы других языков? У меня всего 2 раскладки на клавиатуре. Тут нужны коды символов. – iRumba May 06 '16 at 15:37
-
-
-
@iRumba: Почему издевательство? Если есть готовая таблица, почему бы не скопипастить её в код? Не по одному символу, а всю вместе. – VladD May 10 '16 at 08:46
0
Используй коды ASCII, английский символы начинаются от 65 hex до 122hex русские - hex 192-255 Вот тут можно посмотреть коды
Тебе нужно каждый символ сравнивать просто
string value = "Паранoрмальное";
// Convert the string into a byte[].
byte[] asciiBytes = Encoding.ASCII.GetBytes(value);
Senior Pomidor
- 12,720
-
Ну зачем сразу ASCII-то использовать? Какие преимущества у этой кодировки перед Юникодом? – Pavel Mayorov May 06 '16 at 14:39
ABEKMHOPCTXaeopcyx. – Саша Черных May 06 '16 at 14:26