Я рассмотрел такие вопросы, как Получите длину строки и Почему символы эмодзи, такие как ????, так странно трактуются в строках Swift? , но ни то, ни другоеохватывают этот конкретный вопрос.
Все началось с попытки применить модификаторы тона кожи к символам эмодзи (см. Добавление модификатора тона кожи к эмодзи программно ).Это привело к удивлению, что происходит, когда вы применяете модификатор тона кожи к обычному символу, такому как "A"
.
Примеры:
let tonedThumbsUp = "?" + "?" // ??
let tonedA = "A" + "?" // A?
Я пытаюсь обнаружить этот второй случай.count
обеих этих строк равно 1. И unicodeScalars.count
равно двум для обоих.
Как определить, отображается ли получающаяся строка как один символ при отображении?Другими словами, как я могу определить, применялся ли модификатор тона кожи для создания одного символа или нет?
Я пробовал несколько способов вывести информацию о строке, но ни один из них не дал желаемого результата.
func dumpString(_ str: String) {
print("Raw:", str, str.count)
print("Scalars:", str.unicodeScalars, str.unicodeScalars.count)
print("UTF16:", str.utf16, str.utf16.count)
print("UTF8:", str.utf8, str.utf16.count)
print("Range:", str.startIndex, str.endIndex)
print("First/Last:", str.first == str.last, str.first, str.last)
}
dumpString("A?")
dumpString("\u{1f469}\u{1f3fe}")
Результаты:
Raw: A? 1
Scalars: A? 2
UTF16: A? 3
UTF8: A? 3
First/Last: true Optional("A?") Optional("A?")
Raw: ?? 1
Scalars: ?? 2
UTF16: ?? 4
UTF8: ?? 4
First/Last: true Optional("??") Optional("??")