NSString в Emoji Unicode

Я пытаюсь извлечь файл JSON из бэкэнда, содержащий юникоды для смайликов. Это не устаревшие юникоды (пример: ), а юникоды, которые работают на разных платформах (пример: \U0001F604).

Вот пример извлечения JSON:

[
 {
 "unicode": "U0001F601",
 "meaning": "Argh!"
 },
 {
 "unicode": "U0001F602",
 "meaning": "Laughing so hard"
 }
]

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

Любая помощь приветствуется!


person Jeremy H    schedule 09.07.2014    source источник


Ответы (1)


Чтобы преобразовать эти символы Юникода в NSString, вам нужно будет получить байты этих символов Юникода.

После получения байтов легко инициализировать NSString байтами. Ниже код делает именно то, что вы хотите. Предполагается, что jsonArray - это NSArray, сгенерированный из вашего json.

// initialize using json serialization (possibly NSJSONSerialization)
NSArray *jsonArray; 

[jsonArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *charCode = obj[@"unicode"];

    // remove prefix 'U'
    charCode = [charCode substringFromIndex:1];

    unsigned unicodeInt = 0;

    //convert unicode character to int
    [[NSScanner scannerWithString:charCode] scanHexInt:&unicodeInt];


    //convert this integer to a char array (bytes)
    char chars[4];
    int len = 4;

    chars[0] = (unicodeInt >> 24) & (1 << 24) - 1;
    chars[1] = (unicodeInt >> 16) & (1 << 16) - 1;
    chars[2] = (unicodeInt >> 8) & (1 << 8) - 1;
    chars[3] = unicodeInt & (1 << 8) - 1;


    NSString *unicodeString = [[NSString alloc] initWithBytes:chars
                                                       length:len
                                                     encoding:NSUTF32StringEncoding];

    NSLog(@"%@ - %@", obj[@"meaning"], unicodeString);
}];
person ryumer    schedule 09.07.2014
comment
Спасибо! Это помогло мне добиться прогресса за последние несколько дней. Теперь я столкнулся с другой потребностью: преобразовать его обратно в строку, используя формат U0001F601. Я встречал много ответов, в которых используется формат , но не формат U0001F601. Может быть, у вас есть подходящее решение и для этого подхода? - person Jeremy H; 11.07.2014
comment
Ни один из ваших & не требуется. При сдвиге вправо беззнаковых чисел сдвиг вправо является логическим (заполнение нулями). И в любом случае присвоение 8-битного типа char все равно усекло бы значение. И даже если бы они были необходимы, все они должны быть «0xFF» (или, если вы действительно предпочитаете, «((1 ‹ ‹ 8)-1)», включая первые два, поскольку вам всегда нужны только результирующие нижние 8 бит . - person Peter N Lewis; 24.08.2018