cocoa - 来自 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?
解决方案
我的理解是 UTF8 字符的大小是可变的,最多 4 个字节。
这并不完全正确。一个 UTF8代码点最多为 4 个字节。但是一个字符(特别是一个扩展的字素簇),由于组合字符可以更长。最少几十个字节,在最极端的情况下是无限的。看看为什么表情符号字符像
推荐阅读
- prolog - 追加返回 false
- python - Python - 没有命名模块,但模块存在
- ios - 在 Objective-C 项目中使用 Swift Cocoapods
- ios - Metal Custom CIFilter 不同的返回值
- android - Android Gradle 插件仅支持 Crashlytics Gradle 插件版本 1.25.4 及更高版本
- angular - Firebase(网络)为每个节点提供索引
- php - 导致此结果的循环(php):12345678910987654321
- sql-server - 针对多写单读优化 SQL 数据库表
- firebase - 使用 Firebase 进行 Dart Web 开发
- jquery - DataTables.js:使用数据对象动态更新表