【问题标题】:NSJSONSerialization and EmojiNSJSON序列化和表情符号
【发布时间】: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 位代码点。

标签: ios nsstring nsdata nsjsonserialization emoji


【解决方案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 的有什么不同?
    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多