\U0001F603 是在编译时评估的文字。您需要一个可以在运行时执行的解决方案。
所以你想要一个带有动态 unicode 字符的字符串。 %C 如果是 unicode 字符的格式说明符 (unichar)。
[NSString stringWithFormat:@"Hi there! %C", (unichar)(0x01F600 + arc4random_uniform(10))];
unichar 对于表情符号来说太小了。感谢@JoshCaswell 纠正我。
更新:一个有效的答案
@JoshCaswell 的正确答案是 -initWithBytes:length:encoding:,但我想我可以写一个更好的包装器。
- 创建一个函数来完成所有工作。
- 将network ordering 用于标准字节顺序。
- 长度没有幻数。
这是我的答案
NSString *MyStringFromUnicodeCharacter(uint32_t character) {
uint32_t bytes = htonl(character); // Convert the character to a known ordering
return [[NSString alloc] initWithBytes:&bytes length:sizeof(uint32_t) encoding:NSUTF32StringEncoding];
}
所以,在使用中……
NSString *emoji = MyStringFromUnicodeCharacter(0x01F600 + arc4random_uniform(10));
NSString *message = [NSString stringWithFormat:@"Hi there! %@", emoji];
更新 2
最后,放入一个类别,使其成为真正的 Objective-C。
@interface NSString (MyString)
+ (instancetype)stringWithUnicodeCharacter:(uint32_t)character;
@end
@implementation NSString (MyString)
+ (instancetype)stringWithUnicodeCharacter:(uint32_t)character {
uint32_t bytes = htonl(character); // Convert the character to a known ordering
return [[NSString alloc] initWithBytes:&bytes length:sizeof(uint32_t) encoding:NSUTF32StringEncoding];
}
@end
再一次,正在使用中……
NSString *emoji = [NSString stringWithUnicodeCharacter:0x01F600 + arc4random_uniform(10)];
NSString *message = [NSString stringWithFormat:@"Hi there! %@", emoji];