NSJSON序列化和表情符号

Posted

技术标签:

【中文标题】NSJSON序列化和表情符号【英文标题】:NSJSONSerialization and Emoji 【发布时间】:2014-05-22 18:17:41 【问题描述】:

我目前正在尝试将一些包含表情符号的 JSON 发布到 python API。我尝试直接使用包含来自我的 UITextField 表情符号的字符串来输入 NSJSONSerialization,但是序列化程序在没有有意义的解释的情况下崩溃了。 之后我尝试进行一些格式转换,结果是这样的:

NSString *uniText = mytextField.text;
NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *goodMsg = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding] ;

这基本上是可行的,只是生成的 UTF-8 有点“转义”,结果如下:

"title":"\\ud83d\\udc8f\\ud83d\\udc8f\\ud83d\\udc8f\\ud83d"

有什么建议可以解决这个问题吗?

【问题讨论】:

NSJSONSerialization 应该可以工作。 我认为这正是 NSNonLossyASCIIStringEncoding 应该做的。 JSON 应始终为 UTF。 uniText 包含您想要的文本。 goodMsg 包含格式混乱的文本。 NSJSONSerialization 本来可以很好地序列化 uniText,而不是你要求它序列化你搞砸的“goodMsg”。 不要使用NSNonLossyASCIIStringEncoding,使用NSUTF32LittleEndianStringEncoding。表情符号位于 UTF 平面 1 中,因此是 21 位代码点。 【参考方案1】:

有两个难点: 1.苹果冲洗NSStringWRT UTF Planes 1及以上,底层使用 UTF-16 显示通过。一个例子是 length 将返回 2 一个表情符号。 2. 决定将表情符号放入平面 1 的人是 只是难,这是第一次使用平面 1 和很多 旧的 UTF 代码无法正确处理。

示例代码(改编自@Hot Licks): 更新了 OP 表情符号

NSString *uniText = @"?????";
NSDictionary* jsonDict = @@"title":uniText;

NSData * utf32Data = [uniText dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
NSLog(@"utf32Data: %@", utf32Data);

NSError* error = nil;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:&error];
if (jsonData == nil) 
    NSLog(@"JSON serialization error: %@", error);

else 
    NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSLog(@"The JSON result is %@", jsonString);
    NSLog(@"jsonData: %@", jsonData);

NSLog 输出

utf32数据:a6f40100 8ff40100 52f40100 52f40100 a6f40100 JSON 结果是 "title":"?????" jsonData:7b227469 746c6522 3a22f09f 92a6f09f 928ff09f 9192f09f 9192f09f 92a6227d

【讨论】:

【参考方案2】:

叹息:

NSString* uniText = mytextField.text;
NSDictionary* jsonDict = @@"title":uniText;
NSError* error = nil;
NSData* jsonData = [NSJSONSerialization dataWithJsonObject:jsonDict options:0 error:&error];
if (jsonData == nil) 
    NSLog(@"JSON serialization error: %@", error);

else 
    NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSLog(@"The JSON result is %@", jsonString);

如果 myTextField.text 是有效的 NSString,则不需要进行其他转换。 NSJSONSerialization 将提供所有必要的“转义”。

【讨论】:

我已经试过了。我真的只是复制粘贴了您的代码,并且发生 NSData 序列化的行只是与 SIGABRT 崩溃。没有有用的异常,设置异常断点也不会提供进一步的结果... 我修复了它们,否则我显然无法编译它...NSString* text = metadata[@"title"]; NSDictionary* jsonDict = @@"title":text; NSError* 错误 = 零; NSData* jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:0 error:&error]; if (jsonData == nil) NSLog(@"JSON 序列化错误:%@", error); else NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSLog(@"JSON 结果为 %@", jsonString); @TimSpecht Hot Licks 的回答与 Zaph 的有什么不同?

以上是关于NSJSON序列化和表情符号的主要内容,如果未能解决你的问题,请参考以下文章

请问微信😱表情符号还有其它99个表情符号各是啥意思?

什么叫表情符号,emoji怎么弄?

whatsapp和电报的表情符号

CSDN写作表情emoji大全

秤的表情符号怎么打

表情符号(表情)视图/键盘布局的实现