Skip to content

Instantly share code, notes, and snippets.

@alex0x08
Created January 19, 2024 04:05
Show Gist options
  • Save alex0x08/f2cfa820c1842e72c4e0fc066d5a815f to your computer and use it in GitHub Desktop.
Save alex0x08/f2cfa820c1842e72c4e0fc066d5a815f to your computer and use it in GitHub Desktop.
Class that does search and replace for 'visually similar' Latin characters in Russian text
package com.x0x08.yoba
/**
Класс для поиска и автозамены визуально похожих символов латиницы на кириллицу:
'c' -> 'с' и другие
*/
class Matcher {
/**
* Находит и заменяет похожие латинские буквы на кириллические
* @param input
* входящая строка
* @return
* строка с замененными символами
*/
fun replaceSimilarRuEnChars(input: String): String {
val chars = input.toCharArray()
for (i in chars.indices) {
val c = chars[i]
// символ в нижнем регистре используется в качестве ключа
val cLow = c.lowercaseChar()
// поиск по словарю
if (RU_EN_MATCH.containsKey(cLow)) {
// замена
chars[i] = RU_EN_MATCH[cLow]!!
// если оригинальный символ был в верхнем регистре - ставим его и у замены
if (Character.isUpperCase(c))
chars[i] = chars[i].uppercaseChar()
println("найден ASCII символ: '$c' , заменен на: '${chars[i]}'")
}
}
return String(chars)
}
companion object {
// справочник заменяемых символов
private val RU_EN_MATCH: MutableMap<Char, Char> = HashMap()
init {
RU_EN_MATCH['c'] = 'с'
RU_EN_MATCH['b'] = 'ь'
RU_EN_MATCH['o'] = 'о'
RU_EN_MATCH['p'] = 'р'
RU_EN_MATCH['x'] = 'х'
RU_EN_MATCH['m'] = 'м'
RU_EN_MATCH['h'] = 'н'
RU_EN_MATCH['e'] = 'е'
RU_EN_MATCH['t'] = 'т'
RU_EN_MATCH['k'] = 'к'
RU_EN_MATCH['a'] = 'а'
}
}
}
fun main() {
val m = Matcher()
println("Тест 1")
var quote = "cоловей c лиcой в леcу, cтроят домик навеcу"
println("найдено: ${quote.contains("лес")}")
quote = m.replaceSimilarRuEnChars(quote)
println("теперь найдено: ${quote.contains("лес")}")
println("Тест 2")
quote = "Буква B — Beрблюд двугopбый,\n" +
"Он большой и очень гopдый.\n" +
"У вeрблюдa двa горбa,\n" +
"И у буквы B их двa."
println("найдено: ${quote.contains("два")}")
quote = m.replaceSimilarRuEnChars(quote)
println("теперь найдено: ${quote.contains("два")}")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment