将 Unicode 字符串显示为表情符号
Display Unicode String as Emoji
我目前在负载中接收以下格式的表情符号:
\U0001F6A3\U0000200D\U00002640\U0000FE0F
代表“♀️”
但是,如果我尝试显示它,它只会显示上面的字符串(少 1 转义),而不是表情符号,例如
NSString *emoji = payload[@"emoji"];
NSLog(@"%@", emoji) then displays as \U0001F6A3\U0000200D\U00002640\U0000FE0F
好像unicode转义不被识别。如何让上面的字符串显示为表情符号?
请假设无法更改从服务器接收数据的格式。
更新
我找到了另一种方法,但我认为下面发布的 Albert 的答案更好。我发布这个只是为了完整性和参考:
NSArray *emojiArray = [unicodeString componentsSeparatedByString:@"\U"];
NSString *transformedString = @"";
for (NSInteger i = 0; i < [emojiArray count]; i++) {
NSString *code = emojiArray[i];
if ([code length] == 0) continue;
NSScanner *hexScan = [NSScanner scannerWithString:code];
unsigned int hexNum;
[hexScan scanHexInt:&hexNum];
UTF32Char inputChar = hexNum;
NSString *res = [[NSString alloc] initWithBytes:&inputChar length:4 encoding:NSUTF32LittleEndianStringEncoding];
transformedString = [transformedString stringByAppendingString:res];
}
我对此进行了调查,看来您可能没有收到您所说的。如果你在你的 NSLog 中看到 \U0001F6A3\U0000200D\U00002640\U0000FE0F
,那么你很可能实际上收到了 \U0001F6A3\U0000200D\U00002640\U0000FE0F
。我尝试使用变量
NSString *toDecode = @"\U0001F6A3\U0000200D\U00002640\U0000FE0F";
self.tv.text = toDecode;
并且在 textview 中它可以很好地显示表情符号。
所以你必须先修复它,然后它才能正常显示。
删除多余的反斜杠,然后使用反向字符串转换进行转换 stringByApplyingTransform
。转换必须对表情符号使用键 "Any-Hex"。
NSString *payloadString = @"\U0001F6A3\U0000200D\U00002640\U0000FE0F";
NSString *unescapedPayloadString = [payloadString stringByReplacingOccurrencesOfString:@"\\" withString:@"\"];
NSString *transformedString = [unescapedPayloadString stringByApplyingTransform:@"Any-Hex" reverse:YES];
NSLog(@"%@", transformedString);//logs "♀️"
我目前在负载中接收以下格式的表情符号:
\U0001F6A3\U0000200D\U00002640\U0000FE0F
代表“♀️”
但是,如果我尝试显示它,它只会显示上面的字符串(少 1 转义),而不是表情符号,例如
NSString *emoji = payload[@"emoji"];
NSLog(@"%@", emoji) then displays as \U0001F6A3\U0000200D\U00002640\U0000FE0F
好像unicode转义不被识别。如何让上面的字符串显示为表情符号?
请假设无法更改从服务器接收数据的格式。
更新
我找到了另一种方法,但我认为下面发布的 Albert 的答案更好。我发布这个只是为了完整性和参考:
NSArray *emojiArray = [unicodeString componentsSeparatedByString:@"\U"];
NSString *transformedString = @"";
for (NSInteger i = 0; i < [emojiArray count]; i++) {
NSString *code = emojiArray[i];
if ([code length] == 0) continue;
NSScanner *hexScan = [NSScanner scannerWithString:code];
unsigned int hexNum;
[hexScan scanHexInt:&hexNum];
UTF32Char inputChar = hexNum;
NSString *res = [[NSString alloc] initWithBytes:&inputChar length:4 encoding:NSUTF32LittleEndianStringEncoding];
transformedString = [transformedString stringByAppendingString:res];
}
我对此进行了调查,看来您可能没有收到您所说的。如果你在你的 NSLog 中看到 \U0001F6A3\U0000200D\U00002640\U0000FE0F
,那么你很可能实际上收到了 \U0001F6A3\U0000200D\U00002640\U0000FE0F
。我尝试使用变量
NSString *toDecode = @"\U0001F6A3\U0000200D\U00002640\U0000FE0F";
self.tv.text = toDecode;
并且在 textview 中它可以很好地显示表情符号。
所以你必须先修复它,然后它才能正常显示。
删除多余的反斜杠,然后使用反向字符串转换进行转换 stringByApplyingTransform
。转换必须对表情符号使用键 "Any-Hex"。
NSString *payloadString = @"\U0001F6A3\U0000200D\U00002640\U0000FE0F";
NSString *unescapedPayloadString = [payloadString stringByReplacingOccurrencesOfString:@"\\" withString:@"\"];
NSString *transformedString = [unescapedPayloadString stringByApplyingTransform:@"Any-Hex" reverse:YES];
NSLog(@"%@", transformedString);//logs "♀️"