Длина символа 1 в Python, но 2 в Kotlin - PullRequest
2 голосов
/ 24 января 2020

Я перебираю строку в Kotlin и заметил, что Kotlin рассматривает определенный китайский символ как имеющий длину 2. Этот же символ имеет длину 1 в Python 3.8.

Kotlin:

>>> "?".length
2

Python:

>>> len("?")
1

Почему это так и как я могу перебирать строку в Kotlin символ за символом?

1 Ответ

3 голосов
/ 24 января 2020

Вы имеете дело с суррогатной парой. Суррогатные пары - это UTF-способ кодирования определенных символов.

То, что ? не может быть представлено как один Char. Вы можете проверить это, попытавшись определить его как буквенный символ.

val someChar = '?' // Error: Too many character in character literal "?"

Так как правильно их посчитать? В стандартной библиотеке Kotlin есть функция для этого (hasSurrogatePairAt), которую можно добавить в такую ​​функцию расширения:

fun String.countSurrogatePairs() = withIndex().count {
    hasSurrogatePairAt(it.index)
}

Использование:

println("?".countSurrogatePairs()) // 1
println("??".countSurrogatePairs()) // 2

Итак, Python, похоже, уже справился с этим.

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