关于ios:使用Unicode表情符号动态创建NSString

Dynamically create NSString with Unicode emoji

我有字符串@"Hi there! \\U0001F603",如果将其放在UILabel中,它可以正确显示Hi there! ??之类的表情符号。甚至都不会编译。如果我将反斜杠加倍,它会像Hi there! \\U0001F605一样显示Unicode值。

如何实现呢?


退后一步:您拥有的数字1F6603 16 是Unicode代码点,为使其尽可能简单,它是该索引的索引。所有Unicode项目列表中的表情符号。这与计算机实际处理的字节不同,后者是\\\\"编码值\\\\"(从技术上讲,是代码单位。

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

在运行时不能,请修改该文字并以正确的字节结尾,因为编译器已完成工作并下床。

(您可以在书中深入了解此内容及其与NSString的关系幸运的是,可用的编码之一UTF-32直接表示代码点:字节的值与代码点的相同。换句话说,如果您分配合作伙伴如果将点号指定为32位无符号整数,则说明您具有正确的UTF-32编码数据。

这将导致我们执行所需的过程:对于任意代码点,这可能无法按预期工作;并非所有代码点都有效。)

*注意,它对\\\\" normal \\\\"字符串(如@"b")也具有相同的作用。


\\U0001F603是在编译时求值的文字。您想要一个可以在运行时执行的解决方案。

所以您想要一个带有动态unicode字符的字符串。 %C如果Unicode字符(unichar)的格式说明符。

1
[NSString stringWithFormat:@"Hi there! %C", (unichar)(0x01F600 + arc4random_uniform(10))];

unichar对于表情符号而言太小。感谢@JoshCaswell纠正我。

更新:有效的答案

@JoshCaswell对-initWithBytes:length:encoding:给出了正确的答案,但我想我可以写一个更好的包装器。

创建一个函数来完成所有工作。

  • 对标准字节顺序使用网络排序。
  • 长度没有魔术数字。
  • 这是我的答案

    1
    2
    3
    4
    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];
    }

    因此,正在使用中...

    1
    2
    NSString *emoji = MyStringFromUnicodeCharacter(0x01F600 + arc4random_uniform(10));
    NSString *message = [NSString stringWithFormat:@"Hi there! %@", emoji];

    更新2

    最后,放入一个类别使其变为真正的Objective-C。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @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

    再次使用中...

    1
    2
    NSString *emoji = [NSString stringWithUnicodeCharacter:0x01F600 + arc4random_uniform(10)];
    NSString *message = [NSString stringWithFormat:@"Hi there! %@", emoji];