Шаг назад, для второго: это число, которое у вас есть, 1F6603 , является Unicode точка код, который, в попробуйте сделать это как можно проще, это индекс этого emoji в списке всех элементов Unicode. Это не то же самое, что байты, которые компьютер фактически обрабатывает, которые являются «закодированным значением» (технически, код единиц.
Когда вы пишете буквального@"\U0001F603"
в коде, компилятор делает кодировку для вас, писать необходимые байты. * Если у вас нет буквальных во время компиляции, вы должны сделать кодирующую самостоятельно. То есть вы должны преобразовать кодовую точку в набор байтов, которые ее представляют. Например, в кодировке UTF-16, которую использует внутренний код NSString
, ваша кодовая точка представлена байтами ff fe 3d d8 03 de
.
Вы не можете во время выполнения модифицировать этот литерал и в итоге получить правильные байты, потому что компилятор уже выполнил свою работу и ушел спать.
(Вы можете прочитать в глубине об этом материале, и как она относится к NSString
в an article by Ole Begemann at objc.io.)
К счастью, один из доступных кодировок, UTF-32, представляет собой кодовые точки напрямую: значение байтов так же, как и кодовая точка. Другими словами, если вы присвоите номер кодовой точки 32-разрядному беззнаковому целому, у вас есть соответствующие данные в кодировке UTF-32.
Это приводит нас к процессу вам нужно:
// Encoded start point
uint32_t base_point_UTF32 = 0x1F600;
// Generate random point
uint32_t offset = arc4random_uniform(10);
uint32_t new_point = base_point_UTF32 + offset;
// Read the four bytes into NSString, interpreted as UTF-32LE.
// Intel machines and iOS on ARM are little endian; others byte swap/change
// encoding as necessary.
NSString * emoji = [[NSString alloc] initWithBytes:&new_point
length:4
encoding:NSUTF32LittleEndianStringEncoding];
(. NB, что это не может работать, как ожидается, для произвольной точки кода, не все кодовые точки действительны)
* Заметьте, он делает то же самое для «обычных» строк, например, @"b"
.
Отличное объяснение, большое спасибо! –
Не могли бы вы помочь мне с [этим вопросом] (http://stackoverflow.com/questions/38181966/print-unicode-emoji-from-api-response) тоже? –