NSJSONSerialization和Emoji

时间:2014-05-22 18:17:42

标签: ios nsstring nsdata nsjsonserialization emoji

我目前正在尝试将一些包含emojis的JSON发布到python API。我尝试直接使用包含来自 UITextField 的emojis的字符串提供 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"

有任何建议如何解决?

2 个答案:

答案 0 :(得分:4)

有两个困难:
 1.苹果软件NSString WRT UTF Planes 1及以上,基础用途     UTF-16显示通过。一个例子是length将返回2     一个表情符号。
 谁决定把表情符号放在1号飞机上是谁     只是很难,它是第一次使用Plane 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输出

  

utf32Data:a6f40100 8ff40100 52f40100 52f40100 a6f40100
  JSON结果是{" title":""}   jsonData:7b227469 746c6522 3a22f09f 92a6f09f 928ff09f 9192f09f 9192f09f 92a6227d

答案 1 :(得分:0)

叹息:

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将提供所有必要的“转义”。