Ein Schritt zurück für eine zweite: die Zahl, die Sie haben, 1F6603 , ist ein Unicode Codepunkt, die, zu versuchen Sie es so einfach wie möglich zu sagen, ist der Index dieses Emoji in der Liste aller Unicode-Elemente. Das ist nicht dasselbe wie die Bytes, die der Computer tatsächlich behandelt, die den "codierten Wert" (technisch, der Code Einheiten.
Wenn Sie die wörtliche@"\U0001F603"
in Ihrem Code zu schreiben, hat der Compiler die Codierung für Sie, das notwendige Bytes zu schreiben. * Wenn Sie bei der Kompilierung nicht die wörtliche haben, müssen Sie die Codierung selbst tun. Das heißt, Sie müssen den Codepunkt in eine Menge von Bytes umwandeln, die ihn darstellen. In der UTF-16-Codierung, die NSString
intern verwendet, wird Ihr Codepunkt beispielsweise durch die Bytes ff fe 3d d8 03 de
dargestellt.
Sie können dieses Literal zur Laufzeit nicht ändern und enden mit den richtigen Bytes, weil der Compiler seine Arbeit bereits erledigt hat und ins Bett gegangen ist.
(Sie können über diese Dinge in der Tiefe lesen und wie es bezieht sich auf NSString
in an article by Ole Begemann at objc.io.)
Zum Glück, eine der verfügbaren Kodierungen UTF-32, stellt Codepunkte direkt: der Wert der Bytes das gleiche wie der Code-Punkt. Mit anderen Worten, wenn Sie Ihre Codepunktnummer einer 32-Bit-Ganzzahl ohne Vorzeichen zuordnen, verfügen Sie über geeignete UTF-32-kodierte Daten.
Das führt uns auf den Prozess führt Sie brauchen:
// 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, dass dies nicht als für einen beliebigen Code Punkt erwartet funktionieren, nicht alle Codepunkte gültig sind)
* Beachten Sie, dass dies auch für "normale" Strings wie @"b"
gilt.
Tolle Erklärung, vielen Dank! –
Konnten Sie mir mit [dieser Frage] (http://stackoverflow.com/questions/38181966/print-unicode-emoji-from-api-response) auch helfen? –