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

我有一个UITextView ,我称之为messageField 。 该messageField的数据以JSON格式POST到服务器。 当用户键入表情符号时,我无法将数据编码为JSON 。 我在想Emoji使用Unicode编码。

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

编辑 – 2016-03-03 请注意,这个答案是在2011年写的,可能不再相关。

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

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

这里有一些post可能会有所帮助:

  • 绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)
  • 关于iPhone表情符号和网页的问题
  • iPhone表情符号

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

 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]; 

我有同样的问题,经过几个小时的挖掘,终于找到了适合我的答案: 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丢失),那么你有这个问题。 并且链接中的补丁将修复它。

感谢@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上运行完美

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

所以在python中,例如,一定要使用:

 json.dumps(, ensure_ascii=False) 

更新Swift和Objective 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个编码。

数据必须采用JSON规范中列出的5种支持编码之一: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 :