表情符号字符无法编码为JSON

时间:2011-08-24 15:09:20

标签: ios json character-encoding emoji

我有UITextView我称之为messageFieldmessageField中的数据为POST - 以JSON格式提供给服务器。当用户键入表情符号时,我无法将数据编码为JSON。我在想Emoji使用Unicode编码。

有没有办法将表情符号编码为JSON?从JSON返回到表情符号以显示UILabel

6 个答案:

答案 0 :(得分:28)

我使用下面的代码来编码表情符号字符

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

以下代码在UILabel中解码和显示

const char *jsonString = [body UTF8String]; 
NSData *jsonData = [NSData dataWithBytes:jsonString length:strlen(jsonString)]; 
NSString *goodMsg = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding];

答案 1 :(得分:10)

编辑 - 2016-03-03 请注意,此答案于2011年撰写,可能已不再相关。

表情符号字符只是用于呈现特定unicode代码点的特定字体。 iOS使用其中一个Unicode专用区域来表示特定于表情符号的代码点。将这些“字符”视为表情符号的唯一方法是使用表情符号字体,以及知道如何从默认文本字体(如Helvetica)切换到表情符号字体的机器。

我不知道你是如何对JSON进行编码的,但是因为表情符号只是文本,所以只要你以UT-8或UTF-16等Unicode友好格式传输文本就不应该有任何问题。 。您不会在服务器端或数据库中看到它(除非您查看具有先前先决条件的数据),但您应该能够发回相同的原始字节,它应该看起来相同。

以下是一些可能有所帮助的帖子:

答案 2 :(得分:4)

我有同样的问题,经过几个小时的挖掘,终于找到了适合我的答案: https://stackoverflow.com/a/8339255/1090945

如果您使用rails作为服务器,这就是您需要做的。无需在ios / xcode中执行任何操作,只需传递NSString,而无需对服务器执行任何UTF8 / 16编码。

Postegre正确存储代码,就在你将json响应发送回ios客户端时,假设你渲染json:@message,json编码有问题。

您可以通过简单的测试来测试您的rails控制台中是否存在json编码问题:

  
    

test = {“smiley”=>“u {1f604}”}     test.to_json

  

如果打印出“{\”smiley \“:\”\ uf604 \“}”(注意1丢失了),那么你有这个问题。并且链接中的补丁将修复它。

答案 3 :(得分:4)

感谢@Karu,编辑您的回复,我使用此代码:

编码发送到服务器:

NSString *uniText = [NSString stringWithUTF8String:[text_to_send UTF8String]];

NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding];

NSString *str = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];

解码以接收和显示表情符号文本:

NSData *newdata = [received_string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

NSString *mystring = [[NSString alloc] initWithData:newdata encoding:NSNonLossyASCIIStringEncoding];

NSString *finalString= @"";

if (mystring) {
   finalString = mystring;
}else{
   finalString = received_string;
}

此代码在iOS 9上运行完美

答案 4 :(得分:2)

使用表情符号需要注意的一件事 - 如果你的json编码器被设置为产生ASCII输出(即使用\ u< 4十六进制数字>字符格式),一些表情符号字符将因为它们使用两个以上的字节而中断因此不适合允许的4个十六进制数字。

因此在python中,请务必使用:

json.dumps(<object containing emoji strings>, ensure_ascii=False)

答案 5 :(得分:1)

更新Swift&amp;目标C

如果您想通过JSON发送表情符号项,首先需要将数据库格式化为UTF-8并且在IOS中需要对NSUTF8StringEncoding进行编码。因此,首先确保您的数据库合并为UTF-8然后将参数编码为NSUTF8StringEncoding.So这是发送消息时的示例请求。

    let post:NSString = parameters!
    let url:NSURL = NSURL(string: serverURL!)!
    let postData:NSData = post.dataUsingEncoding(NSUTF8StringEncoding)! // Change Here
    let postLength:NSString = String( postData.length )
    let request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = postData
    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("*/*", forHTTPHeaderField: "Accept")
    return request

但是你不需要在iOS中解码为NSUTF8StringEncoding。因为根据苹果文档,它解码了5个编码。

  

数据必须位于中列出的5种受支持的编码之一中   JSON规范:UTF-8,UTF-16LE,UTF-16BE,UTF-32LE,UTF-32BE。该   数据可能有也可能没有BOM。最有效的编码方式   解析是UTF-8,所以如果你可以选择编码传递的数据   使用UTF-8。

     

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSJSONSerialization_Class/#//apple_ref/occ/clm/NSJSONSerialization/JSONObjectWithData:options:error