Kotlin четырехбайтовые литералы юникода? - PullRequest
0 голосов
/ 19 марта 2020

Как я могу объявить диапазон Char в Kotlin, который охватывает четырехбайтовый диапазон?

private val CJK_IDEOGRAPHS_EXT_A = '\u3400' .. '\u4DBF'    // OK
private val CJK_IDEOGRAPHS_EXT_B = '\u20000' .. '\u2A6DF'  // doesn't compile

Я попробовал следующий хак, но получаю предупреждение: "этот бросок никогда не может success ":

private val CJK_IDEOGRAPHS_EXT_B: CharRange = 0x20000 as Char .. 0x2A6DF as Char

В основном я хочу реализовать такую ​​функцию:

fun isCJK(c: Char): Boolean {
    return c in CJK_RADICALS ||
        c in CJK_SYMBOLS ||
        c in CJK_STROKES ||
        c in CJK_ENCLOSED ||
        c in CJK_IDEOGRAPHS ||
        c in CJK_COMPAT ||
        c in CJK_COMPAT_IDEOGRAPHS ||
        c in CJK_COMPAT_FORMS ||
        c in CJK_IDEOGRAPHS_EXT_A
        // EXT_B not working
        // EXT_C not working
        // EXT_D not working
        // EXT_E not working
        // EXT_F not working
}

Я использую Kotlin в Android.

1 Ответ

1 голос
/ 19 марта 2020

На JVM Char - это 16-битный код единица , поэтому максимальный код точка может быть равен 0xFFFF ; упомянутые вами диапазоны представлены суррогатными парами . Таким образом, ваша функция должна вместо этого использовать String, например,

private val CJK_IDEOGRAPHS_EXT_B: IntRange = 0x20000 .. 0x2A6DF 
...

fun isCJK(s: String): Boolean {
    if (s.codePointCount(0, s.length) > 1) 
        throw new IllegalArgumentException("String \"$s\" contains more than 1 codepoint")
    val c = s.codePointAt(0)
    return c in CJK_RADICALS ||
        c in CJK_SYMBOLS ||
        c in CJK_STROKES ||
        c in CJK_ENCLOSED ||
        c in CJK_IDEOGRAPHS ||
        c in CJK_COMPAT ||
        c in CJK_COMPAT_IDEOGRAPHS ||
        c in CJK_COMPAT_FORMS ||
        c in CJK_IDEOGRAPHS_EXT_A ||
        c in CJK_IDEOGRAPHS_EXT_B || ...
}

Java 9 имеет гораздо более удобный метод IntStream codePoints(), но, похоже, он недоступен в Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...