Created
January 19, 2024 04:05
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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