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.苹果冲洗NSString
WRT 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序列化和表情符号的主要内容,如果未能解决你的问题,请参考以下文章