Вы имеете дело с суррогатной парой. Суррогатные пары - это 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, похоже, уже справился с этим.