Apple Emoji / итерация через NSString

Я хочу перебирать «символы» входной строки Emoji (из UITextField), а затем, один за другим, отображать эти значки emoji с помощью UILabel.

for (int i=0; i < len; i++) {  
    unichar c = [transformedString characterAtIndex:i];  
    [label setText:[NSString stringWithFormat:@"%C", c]];  
...

Это работает для текста ASCII, но не для шрифтов Emoji (все, кроме символа сердца, пусты). Как я заметил, один значок эмодзи представлен двумя символами в строке. Насколько я знаю, Emoji использует символы юникода для частной области.

Есть ли способ добиться этого?

Спасибо большое, вы избавили меня от головной боли...


person Patrick    schedule 06.04.2012    source источник
comment
Проверьте мой вопрос, аналогичный вашей проблеме: stackoverflow. ком/вопросы/4615506/   -  person Eimantas    schedule 06.04.2012


Ответы (1)


Вы можете использовать один из методов экземпляра enumerate* для NSString с параметром NSStringEnumerationByComposedCharacterSequences.

- (void)enumerateSubstringsInRange:(NSRange)range
                           options:(NSStringEnumerationOptions)opts
                        usingBlock:(void (^)(NSString *substring,
                                             NSRange substringRange,
                                             NSRange enclosingRange,
                                             BOOL *stop))block

NSString использует кодировку UTF-16, которая представляет некоторые кодовые точки как два 16-битных значения. Вы также можете вручную проверить эти «суррогатные пары» в строке и вручную объединить их, но тогда вы все равно будете получать только кодовые точки, а не символы.


[transformedString
    enumerateSubstringsInRange:NSMakeRange(0,[transformedString length]
                       options:NSStringEnumerationByComposedCharacterSequences
                    usingBlock: ^(NSString *substring,NSRange,NSRange,BOOL *)
{
    [label setText:substring];
}];
person bames53    schedule 06.04.2012