\U0001F603
是在编译时计算的文字。你需要一个可以在运行时执行的解决方案。
所以你想要一个包含动态Unicode字符的字符串。%C
是Unicode字符(unichar
)的格式说明符。
[NSString stringWithFormat:@"Hi there! %C", (unichar)(0x01F600 + arc4random_uniform(10))];
unichar
对于表情符号来说太小了。感谢@JoshCaswell指出我的错误。
更新:一个有效的答案
@JoshCaswell的-initWithBytes:length:encoding:
是正确的答案,但我认为我可以写一个更好的包装器。
- 创建一个函数来完成所有工作。
- 使用网络顺序以进行标准字节顺序。
- 没有长度的魔法数字。
这是我的答案
NSString *MyStringFromUnicodeCharacter(uint32_t character) {
uint32_t bytes = htonl(character);
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);
return [[NSString alloc] initWithBytes:&bytes length:sizeof(uint32_t) encoding:NSUTF32StringEncoding];
}
@end
And again, in use…
NSString *emoji = [NSString stringWithUnicodeCharacter:0x01F600 + arc4random_uniform(10)];
NSString *message = [NSString stringWithFormat:@"Hi there! %@", emoji];
(一个带有问号的方块),而不是表情符号。 - Iulian Onofrei0x01F600
。当我第一次发布时,我犯了一个错误,写成了0x01F60
。 - Jeffery Thomas0x01F600
。 - Iulian Onofrei