将表情符号 unicode 转换为十六进制代码点
Convert emoji unicode to hex codepoint
我正在尝试获取表情符号的十六进制代码点。
下面的代码成功 returns 没有代理对的表情符号的十六进制代码点(例如 1f58d for ️):
NSData *data = [@"️" dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
uint32_t unicode;
[data getBytes:&unicode length:sizeof(unicode)];
NSLog(@"%x", unicode);
然而,对于像“”这样的表情符号,其代码点为 “1f932-1f3ff”,上述方法仅 returns 第一个点,” 1f932。请问如何获得具有多个代码点的表情符号的完整十六进制代码点(任何代码方法都可以)? (请注意,某些表情符号,如“♀️”最多有 5 个代码点,例如 ♀️)
您需要将 uint32_t
更改为 uint64_t
。
NSData *data = [@"" dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
uint64_t unicode;
[data getBytes:&unicode length:sizeof(unicode)];
NSLog(@"%llx", unicode);
- (NSArray<NSNumber*>*) unicodeCodePoints:(NSString*)unicodeChar
{
NSMutableArray* codePoints = [[NSMutableArray alloc] init];
NSData* data = [unicodeChar dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
for ( NSUInteger i = 0; i < data.length / sizeof(UInt32); i++ )
{
UInt32* arr = (UInt32*)(data.bytes);
[codePoints addObject:@(arr[i])];
}
return codePoints;
}
那么你可以这样称呼它:
for ( NSNumber* num in [self unicodeCodePoints:@"♀️"] )
{
NSLog(@"%0*x", (int)(2*sizeof(UInt32)), (UInt32)[num unsignedIntegerValue]);
}
请注意,这假定单个 unicode 字符由 NSString 参数表示。
我正在尝试获取表情符号的十六进制代码点。
下面的代码成功 returns 没有代理对的表情符号的十六进制代码点(例如 1f58d for ️):
NSData *data = [@"️" dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
uint32_t unicode;
[data getBytes:&unicode length:sizeof(unicode)];
NSLog(@"%x", unicode);
然而,对于像“”这样的表情符号,其代码点为 “1f932-1f3ff”,上述方法仅 returns 第一个点,” 1f932。请问如何获得具有多个代码点的表情符号的完整十六进制代码点(任何代码方法都可以)? (请注意,某些表情符号,如“♀️”最多有 5 个代码点,例如 ♀️)
您需要将 uint32_t
更改为 uint64_t
。
NSData *data = [@"" dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
uint64_t unicode;
[data getBytes:&unicode length:sizeof(unicode)];
NSLog(@"%llx", unicode);
- (NSArray<NSNumber*>*) unicodeCodePoints:(NSString*)unicodeChar
{
NSMutableArray* codePoints = [[NSMutableArray alloc] init];
NSData* data = [unicodeChar dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
for ( NSUInteger i = 0; i < data.length / sizeof(UInt32); i++ )
{
UInt32* arr = (UInt32*)(data.bytes);
[codePoints addObject:@(arr[i])];
}
return codePoints;
}
那么你可以这样称呼它:
for ( NSNumber* num in [self unicodeCodePoints:@"♀️"] )
{
NSLog(@"%0*x", (int)(2*sizeof(UInt32)), (UInt32)[num unsignedIntegerValue]);
}
请注意,这假定单个 unicode 字符由 NSString 参数表示。