使用Unicode表情符号动态创建NS字符串 [英] Dynamically create NSString with Unicode emoji

查看:0
本文介绍了使用Unicode表情符号动态创建NS字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有字符串@"Hi there! U0001F603",如果我把它放在UILabel中,它会正确地显示表情符号Hi there! 😃

但我想像[NSString stringWithFormat:@"Hi there! U0001F60%ld", (long)arc4random_uniform(10)]那样动态创建它,但它甚至不能编译。 如果我双反斜杠,它显示的Unicode值字面上类似Hi there! U0001F605

如何实现此目标?

回过头来看一下:您拥有数字1F660316是一个推荐答案代码点,尽可能简单地说,它是此表情符号在所有Unicode项列表中的索引。这与计算机实际处理的字节不是一回事,后者是"编码值"(从技术上讲,代码单位

当您在代码中编写文字@"U0001F603"时,编译器会为您进行编码,并写入必要的字节。*如果您在编译时没有文字,则必须自己进行编码。也就是说,必须将代码点转换为一组表示它的字节。例如,在NSString内部使用的UTF-16编码中,您的代码点由字节ff fe 3d d8 03 de表示。

您不能在运行时修改该文字并以正确的字节结束,因为编译器已经完成了它的工作并上床睡觉了。

(您可以在an article by Ole Begemann at objc.io中深入阅读此内容以及它与NSString的关系。)

幸运的是,其中一种可用的编码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];

(请注意,对于任意代码点,这可能不会按预期工作;并非所有代码点都有效。)


*注意,它也对@"b"这样的"正常"字符串执行相同的操作。

这篇关于使用Unicode表情符号动态创建NS字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆