如何知道字符串中是否有一个或多个西里尔符号并计算它们 (Kotlin)

How to know if there one or more Cyrillic symbol in String and count them (Kotlin)

提问人:VOVDOGG 提问时间:1/31/2023 更新时间:2/2/2023 访问量:146

问:

我正在研究QR解析器。在我的QR中,我有一个字段“encoding”,它向我们显示了一个字符串编码(“1”=w1251,“2”=UTF8,“3”=KOI8-R)。我需要用 UTF-8 解码 1、3,所以没关系:

private fun checkEncoding(encoding: String, decodedString: String) =
    when (encoding) {
        "1" -> decodedString.toByteArray(Charset.forName("windows-1251")).toString(Charset.forName("UTF-8"))
        "3" -> decodedString.toByteArray(Charset.forName("KOI8-R")).toString(Charset.forName("UTF-8"))
        "2" -> decodedString
        else -> throw ErrorsBuilder.UNKNOWN_ENCODING_ERROR.unknownEncodingException(decodedString)
    }

但有时我们会得到错误的 QR,它的编码 = 1,但字符串为 UTF8。 我们想处理这种情况,也许任何人都可以提供帮助。我们决定制定下一个逻辑:如果字符串有俄语符号 -> 对它不做任何事情,那就是 UTF8。否则 -> docheckEncoding()

第一个想法:检查它们是否是字符串中的俄语字母。我这样做了:

fun main() {
    val string1 = "Name=Филиал"
    val string2 = "Name=СчеС"
    val string3 = "ФФФ"

    println(parse2(string1)) //false
    println(parse2(string2)) //false
    println(parse2(string3)) //true }

fun parse2(string: String): Boolean {
    return string.matches("[а-яёА-ЯЁ]+".toRegex())
}

如何检查字符串是否至少有一个带有许多英语的俄语符号?像 ?matchesAny()

第二个问题是,在字符串“ST00011|Name=РЎС‡РμС“符号”Р“、”С“也是俄语。我决定做一些计数器,从字符串中计算俄罗斯符号,并将该数字与字符串长度进行比较。 但我不知道该怎么做。

所以也许你对我的情况有任何想法和更好的解决方案?或者可以给我标题问题的答案?

多谢

字符串 Kotlin 编码 UTF-8 西里尔文

评论

1赞 JosefZ 2/1/2023
你面临一个 mojibake 情况(在 Python 中的例子,因为它的普遍可理解性):returns ,反之亦然:-> 或 -> 。因此,俄语(西里尔文)符号的存在本身并不意味着正确性......例如 - -> - 两者都是俄语:(U+0420,西里尔大写字母 Er)和 (U+0451,西里尔小写字母 Io'Сче'.encode( 'cp1251').decode( 'utf8')Сче'Счесть'.encode( 'utf8').decode( 'cp1251')Счесть'Филиал'.encode( 'utf8').decode( 'cp1251')Филиал'и'.encode( 'utf8').decode( 'cp1251')РёиРёРё)

答:

0赞 hsz 2/2/2023 #1

简单的正则表达式检查怎么样:

Regex("[\\u0400-\\u04FF]").containsMatchIn(inputString)