Показывать строку Юникода как эмодзи - PullRequest
0 голосов
/ 11 марта 2020

В настоящее время я получаю смайлики в полезной нагрузке в следующем формате:

\\U0001F6A3\\U0000200D\\U00002640\\U0000FE0F

, который представляет "?‍♀️"

Однако, если я пытаюсь отобразить это, он показывает только строка выше (экранирована на 1 меньше), а не смайлики, например

NSString *emoji = payload[@"emoji"];
NSLog(@"%@", emoji) then displays as \U0001F6A3\U0000200D\U00002640\U0000FE0F

Это похоже на то, что юникод не может быть распознан. Как получить приведенную выше строку для отображения в виде эмодзи?

Предположим, что формат, в который поступают данные с сервера, изменить нельзя.

ОБНОВЛЕНИЕ

Я нашел другой способ сделать это, но я думаю, что ответ Альберта, размещенный ниже, лучше. Я публикую это только для полноты и справки:

NSArray *emojiArray = [unicodeString componentsSeparatedByString:@"\\U"];
NSString *transformedString = @"";

for (NSInteger i = 0; i < [emojiArray count]; i++) {

    NSString *code = emojiArray[i];
    if ([code length] == 0) continue;
    NSScanner *hexScan = [NSScanner scannerWithString:code];
    unsigned int hexNum;
    [hexScan scanHexInt:&hexNum];
    UTF32Char inputChar = hexNum;
    NSString *res = [[NSString alloc] initWithBytes:&inputChar length:4 encoding:NSUTF32LittleEndianStringEncoding];
    transformedString = [transformedString stringByAppendingString:res];
}

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Удалите лишнюю обратную косую черту sh, затем выполните преобразование с обратным преобразованием строки stringByApplyingTransform. Преобразование должно использовать клавишу «Any-Hex» для Emojis.

NSString *payloadString = @"\\U0001F6A3\\U0000200D\\U00002640\\U0000FE0F";
NSString *unescapedPayloadString = [payloadString stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];
NSString *transformedString = [unescapedPayloadString stringByApplyingTransform:@"Any-Hex" reverse:YES];

NSLog(@"%@", transformedString);//logs "?‍♀️"
1 голос
/ 16 марта 2020

Я исследовал это, и, возможно, вы не получаете то, что, как вы говорите, вы получаете. Если вы видите \U0001F6A3\U0000200D\U00002640\U0000FE0F в своем NSLog, скорее всего, вы на самом деле получаете \\U0001F6A3\\U0000200D\\U00002640\\U0000FE0F на своем конце. Я попытался использовать переменную

NSString *toDecode = @"\U0001F6A3\U0000200D\U00002640\U0000FE0F";
self.tv.text = toDecode;

И в textview он отображает смайлики в порядке. enter image description here

Итак, вы должны сначала исправить это, а затем оно будет хорошо отображаться.

...