Iul*_*rei 5 unicode objective-c ios emoji
我有一个字符串@"Hi there! \U0001F603",它可以正确显示表情符号,就像Hi there! 我将它放在UILabel.
但我想像 一样动态创建它[NSString stringWithFormat:@"Hi there! \U0001F60%ld", (long)arc4random_uniform(10)],但它甚至无法编译。如果我加倍反斜杠,它会显示 Unicode 值,字面意思是Hi there! \U0001F605.
我怎样才能实现这个目标?
退后一步,一秒钟:您拥有的数字 1F6603 16是一个 Unicode代码点,为了尽可能简单地说,它是该表情符号在所有 Unicode 项目列表中的索引。这与计算机实际处理的字节不同,后者是“编码值”(技术上是代码单元)。
当您在代码中写入文字时 @"\U0001F603",编译器会为您进行编码,写入必要的字节。*如果您在编译时没有文字,则必须自己进行编码。也就是说,您必须将代码点转换为表示它的一组字节。例如,在NSString内部使用的 UTF-16 编码中,您的代码点由 bytes 表示ff fe 3d d8 03 de。
您无法在运行时修改该文字并最终得到正确的字节,因为编译器已经完成其工作并上床睡觉。
(您可以在Ole Begemann 在 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];
Run Code Online (Sandbox Code Playgroud)
(注意,对于任意代码点,这可能无法按预期工作;并非所有代码点都有效。)
*注意,它对于“普通”字符串(如 , )也执行相同的操作@"b"。
| 归档时间: |
|
| 查看次数: |
2406 次 |
| 最近记录: |