首页 > 解决方案 > 来自 NSUTF8StringEncoding 的 6 字节表情符号

问题描述

我对以 UTF8 编码的表情符号的字节表示感到困惑。我的理解是 UTF8 字符的大小是可变的,最多 4 个字节。

当我在 iOS 13 上以 UTF8 编码 ❤️ 表情符号时,我得到了 6 个字节:

NSString* heartEmoji = @"❤️";
NSData* utf8 = [heartEmoji dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", utf8); // {length = 6, bytes = 0xe29da4efb88f}

如果我恢复操作,只消耗前 3 个字节,我会得到一个 unicode 心脏:

BYTE bytes[3] = { 0 };
[utf8 getBytes:bytes length:3];
NSString* decoded = [[NSString alloc] initWithBytes:bytes length:3 encoding:NSUTF8StringEncoding];
NSLog(@"%@", decoded); // ❤

请注意,我以心脏为例;我尝试了很多表情符号,大多数是 UTF8 中的 4 个字节,但有些是 6 个。

我对 UTF8 有一些错误的假设吗?我该怎么做才能将 4 个字节的所有表情符号表示为 UTF8?

标签: cocoautf-8nsstringemojinsutf8encoding

解决方案


我的理解是 UTF8 字符的大小是可变的,最多 4 个字节。

这并不完全正确。一个 UTF8代码点最多为 4 个字节。但是一个字符(特别是一个扩展的字素簇),由于组合字符可以更长。最少几十个字节,在最极端的情况下是无限的。看看为什么表情符号字符像


推荐阅读